Dismissile
Dismissile

Reputation: 33071

ASP.net MVC - Binding a form value to a different name

I have a View that has the ability to both create and edit an item that I have separated into partial views:

MainEditView.cshtml
_CreateChildDialog.cshtml
_EditChildDialog.cshtml

I have separate ViewModels for both the Create and Child items:

public class CreateChildViewModel
{
    public string ItemText { get; set; }
}


public class EditChildViewModel 
{
    public string ItemText { get; set; }
}

Since the partial views for the Edit and Create dialog boxes will both be rendered on the same page, I will have a conflict for form id's and names...since they are both called ItemText.

Is it possible to customize the binding of these elements without writing a custom model binder?

I would like to do something like:

public class EditChildViewModel
{
    [BindFrom("EditItemText")]
    public string ItemText { get; set; }
}

Or does it just make more sense to rename the ViewModel properties to:

public class EditChildViewModel 
{
    public string EditItemText { get; set; }
}

public class CreateChildViewModel
{
    public string CreateItemText { get; set; }
}

EDIT Based on converstation with Darin I want to make this a little more clear.

My Parent has an Edit action. When you edit the Parent, you would never create a new child or edit a child when you are calling the ParentController.Edit action.

I have a separate controller for the Child object that has a Create and Edit method:

public class ChildController 
{
    public ActionResult Edit() {}
    public ActionResult Create() {}
}

I am using jQuery calls to asynchronously post to this controller when you edit or create a child. Basically I use a jquery dialog to create/edit a child that will get saved immediately when I click Ok on the dialog. This would happen even before clicking save for the Edit action of the parent.

Upvotes: 0

Views: 854

Answers (1)

Darin Dimitrov
Darin Dimitrov

Reputation: 1038810

I would use editor templates. Normally you would pack those two view models into a main view model which will be used by the main view:

public class MyViewModel
{
    public CreateChildViewModel Create { get; set; }
    public EditChildViewModel Edit { get; set; }
}

and then:

@model MyViewModel
@Html.EditorFor(x => x.Create)
@Html.EditorFor(x => x.Edit)

and I would replace the two partials by their corresponding editor templates (~/Views/Shared/EditorTemplates/CreateChildViewModel.cshtml and ~/Views/Shared/EditorTemplates/EditChildViewModel.cshtml). The editor templates will take of generating proper names and ids of the corresponding input elements.

Personally I tend to prefer editor/display templates instead of partials as they handle better naming of input elements.

Upvotes: 3

Related Questions