我有一个简单的表单来修改复杂模型的一部分。我当然可以削减模型,但我想解决复杂的情况,因为我们最终将处理整个模型。
我希望渲染的输入有一个简单的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
大写无效。
答案 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);