MVC模型绑定 - 在部分编辑期间维护值

时间:2013-10-01 20:07:45

标签: c# asp.net asp.net-mvc razor http-post

我有一个类似于

的模型类
public class Mod
{
    public string StaticProp1 {get; set;}
    public string StaticProp2 {get; set;}

    public string EditableProp1 {get; set;}
}

我想要一个视图,我可以在其中修改EditableProp1,但显示StaticProp1StaticProp2但不可编辑。

我创建了一个强类型视图:

@model Mod

@using (Html.BeginForm()) 
{
    <p>@Model.StaticProp1</p>
    <p>@Model.StaticProp2</p>

    @Html.TextBoxFor(m => m.EditableProp1)

    <input type="submit" value="Save" />
}

在我的控制器中,当我处理动作时,我发现EditableProp1很好。

[HttpPost]
public ActionResult Edit(Mod model, FormCollection collection)
{
    string editableProp = model.EditableProp1; //This works fine

    string staticProp1 = model.StaticProp1; //Missing  

    return View(model);
}

如果由于某种原因我回发会导致问题,因为staticProp1现在将为null并且视图将无法显示它。

我知道我可以添加

@Html.HiddenFor(m => m.StaticProp1)
@Html.HiddenFor(m => m.StaticProp2)

我认为它会正常工作,但我想知道是否还有其他更好的方法。

我的值已经在表单上(<p>@Model.StaticProp1</p>)。有没有办法将模型绑定到不可编辑的标签?是否有一个HTML助手可以做这样的事情?

顺便说一句,如果不是很明显,我刚开始使用MVC,所以如果我完全忽略了这一点,请告诉我!

2 个答案:

答案 0 :(得分:2)

要保留的模型的每个属性都必须在表单中(在编辑器或隐藏字段中)。您可以按照自己的建议使用Html.HiddenFor()。如果您想避免使用隐藏字段重载视图,则只能在隐藏字段中存储实体的ID,并根据Post操作中的ID获取其余数据。或者使用带有Html.TextBoxFor()属性的readonly,有关详情,请参阅this question(我也喜欢第二个答案中的方法)。

答案 1 :(得分:1)

我认为这个问题更多地涉及模型绑定及其工作原理。如果您不想在这里使用隐藏字段(我认为适合您的场景),您可以通过继承以下类来自定义Model Bind:

DefaultModelBinder