Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Use @Html.EditorFor() without the view model

I want to do something like this so I can create a modal dialog that I'll invoke late with jQuery

<div class="modal" id="modalName" style="display: none;">
<div class="modal-header">
    <a class="close" data-dismiss="modal">×</a>
    <h3>Edit Contacts</h3>
</div>
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new Dictionary<string, object> { { "class", "form-horizontal" } }))
{
    <div class="modal-body">
    @Html.EditorFor(model => new ViewModel(), "ViewModelTemplateName")
    </div>
    <div class="modal-footer">
        <a href="#" class="btn" data-dismiss="modal">Close</a>
        <button type="submit" class="btn btn-primary">
            Submit</button>

    </div>
}
</div>

On this line

@Html.EditorFor(model => new ViewModel(), "ViewModelTemplateName")

I get the error

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

I don't understand why it would care where or what the instance is (as long as its the right type)

@Html.Partial("~/Views/Shared/EditorTemplates/ViewModel.cshtml", new ViewModel()) does the trick, but I have to declare the full path the the template...this sucks a bit.

so is there a better way to do it?

like image 376
Peter Avatar asked Apr 19 '12 23:04

Peter


1 Answers

Technically it's not the instance that's the problem. It's an expression, not a function, that you're passing there and the expression parser used by EditorFor, to get the meta data it uses to identify the properties etc, doesn't support new expressions.

You can simply declare a new instance of the model outside of the EditorFor statement and do this:

@{ var emptyViewModel = new ViewModel(); }
@Html.EditorFor(model => emptyViewModel, "ViewModelTemplateName") 

That should work.

That said - not using part of the model in the expression is a little weird. You should perhaps consider extracting the dialog out to it's own partial view that has ViewModel as it's model type, and then you can use EditorForModel in that, and call it from this parent view using a new ViewModel() as the model you pass to it.

like image 146
Andras Zoltan Avatar answered Sep 19 '22 15:09

Andras Zoltan