3

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

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

@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参数自动解析为动作方法的参数?因为这是 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为 null 并且不会保存到数据库中。从萤火虫捕获的帖子正文是这样说的:

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

我也尝试过pPhone1参数名称中的大写无效。

4

2 回答 2

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)
{
    ...
}
于 2013-01-24T07:38:43.037 回答
0

如果我理解正确,您希望 CallInfo.Phone1 和 Phone1 作为 Action 方法的参数。在这种情况下,您的模型应该是 CallInfo 模型和 Phone1(字符串?)参数的容器。

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

}

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

@model Project.Models.bigModel

并将其用于您的操作方法的签名

    public ActionResult Edit(bigModel);
于 2013-01-24T07:39:23.703 回答