编辑对于id&名称约定覆盖

时间:2013-01-24 07:21:26

标签: asp.net-mvc forms asp.net-mvc-4 html-helper editorfor

我有一个简单的表单来修改复杂模型的一部分。我当然可以削减模型,但我想解决复杂的情况,因为我们最终将处理整个模型。

我希望渲染的输入有一个简单的Id和Name,但模型名称似乎是不可移动的。

@Html.EditorFor(model => model.CallInfo.Phone1,
   new { @id = "Phone1", @name = "Phone1"})

应输出此

<input type="text" value="" name="Phone1" id="Phone1" class="text-box single-line">

相反,它输出这个,CallInfo前缀为。

<input type="text" value="" name="CallInfo.Phone1" id="CallInfo_Phone1" class="text-box single-line">

如果无法取消,那么有没有办法让CallInfo.Phone1参数自动解析为action方法的参数?因为这在C#中是无效的语法。

public ActionResult UpdatePhoneNumber(Int32 profileId, String CallInfo.Phone1)

再一次,我意识到我可以从请求中手动检索它,就像这样

HttpRequest.Current.Params["CallInfo.Phone1"]

但看起来C#MVC4惯例似乎应该在这里很好地结合在一起,使这些自动魔术小部件中的一个做正确的事。

更新:根据Dmitri的回答,我按原样离开了视图标记,生成了name="CallInfo.Phone1"属性并将操作签名修改为:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdatePhoneNumber(Int32 profileId,
    [Bind(Prefix = "CallInfo")] string phone1)
{
    // Save it
}

在调试器中,phone1为空,不会保存到数据库中。从萤火虫捕获的哨所,有这样说:

Parameters          application/x-www-form-urlencoded
CallInfo.Phone1     8121234567

我还尝试将p参数名称中的Phone1大写无效。

2 个答案:

答案 0 :(得分:1)

  

如果这不能被打败,那么有没有办法获得   CallInfo.Phone1参数自动解析为参数   行动方法?因为这在C#中是无效的语法。

当然,使用[Bind]属性:

public ActionResult UpdatePhoneNumber(
    int profileId, 
    [Bind(Prefix = "CallInfo")] string phone1
)
{
    ...
}

甚至更好,通过定义视图模型:

public class MyViewModel
{
    public int ProfileId { get; set; }
    public CallInfoViewModel CallInfo { get; set; }
}

public class CallInfoViewModel
{
    public string Phone1 { get; set; }
}

然后让控制器操作将此视图模型作为参数:

public ActionResult UpdatePhoneNumber(MyViewModel model)
{
    ...
}

答案 1 :(得分:0)

如果我理解你,你需要CallInfo.Phone1和Phone1作为Action Method的参数。在这种情况下,您的Model应该是CallInfo Model和Phone1(string?)参数的容器。

class bigModel
{
   CallInfoType CallInfo { get;set;}
   string Phone1 { get;set;}

}

将相同的模型传递给您的视图

@model Project.Models.bigModel

并在您的行动方式签名中使用它

    public ActionResult Edit(bigModel);