2013-10-01 60 views
3

期间维持值我有去像MVC模型绑定 - 部分编辑

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现在将是无效和视图将无法显示。

我知道,我可以添加

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

我的看法,并认为它会正常工作,但我不知道是否有其他更好的办法。

我的数值已经在窗体上(<p>@Model.StaticProp1</p>)。有没有办法将模型绑定到这样的不可编辑标签?有没有一个HTML助手做这样的事情?顺便说一句,如果它不明显,我刚刚开始与MVC,所以如果我完全错过了这一点,请让我知道!

+0

如果'StaticProp'来自数据库或东西,你可以再次读取它们并在回发方法中设置模型数据 – Shoe

+2

为什么您要避免使用HiddenFor?这是一个常见的用例。 –

+0

我想避免它,因为它们中有很多(我的模型比我在这里展示的更复杂)。它只是觉得他们混淆了这个观点,而且由于价值观已经在形式上,我认为也许还有另一种方式。 有点像@ Html.LiteralFor(...) –

回答

2

您要坚持的模型的每个属性都必须以表单的形式(在编辑器或隐藏字段中)。正如你所建议的,你可以使用Html.HiddenFor()。如果您想避免使用隐藏字段来重载视图,则可以只将实体的ID存储在隐藏字段中,并根据Post操作中的id获取其余数据。或者使用Html.TextBoxFor()readonly属性,请参阅this question了解更多信息(我也喜欢第二个答案中的方法)。

+0

我相信禁用属性会导致该字段不发布,这是目前他的问题。 readonly属性是他想要的属性。 –

+0

这是有道理的,我认为'只读'属性是确实的方式。我添加了一个相关的问题。 –

+1

谢谢,这些批准工作正常。我只是想确保我没有错过任何显而易见的事情,这似乎并非如此。 –

1

我认为这个问题更多地涉及到模型绑定以及它是如何工作的。如果你不想在这里使用隐藏域(我认为适合您的方案),你可以自定义模型绑定通过继承一个类:

DefaultModelBinder