I've read around that the given way of doing this seems to be having different view models (which is a bit overkill imo) for different actions/controllers.

I thought

@Html.EditorFor(model => model.Ingredient.Name, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", data_val = "false"} })

might work but unfortunately not.

Does anyone have any ideas?

All unobtrusive validation (the kind used by ASP.NET MVC) is predicated on finding and parsing data attributes on each object. Those carry all the information that the validation engine needs to run and only elements that have data-val="true" are included.

Any HTML attributes you pass will override any of the default attributes, so the easiest way is to just force data-val="false" and the form element won't be included in the validation engine and none of the other dependent tags will be parsed.

Here's an example from ASP .NET MVC Disable Client Side Validation at Per-Field Level:

<!-- language: lang-cs -->
@Html.TextBoxFor(m => m.BatchId, new { data_val = "false" })