【问题标题】:ASP.NET MVC5 controller action method parameter null [duplicate]ASP.NET MVC5 控制器操作方法参数 null [重复]
【发布时间】:2017-01-26 14:05:57
【问题描述】:

是否可以从@Html.EditorFor 中修改发布到控制器操作的属性名称?

我有一个视图,它既显示对象列表,又显示一个允许用户创建对象的表单。如果可能的话,我只想在创建时发回新的对象值,而不是整个视图模型。

视图的 ViewModel 结构如下所示:

public class GenericIndexViewModel
{
    public IEnumerable<GenericListViewModel> ExistingObjects { get; set; }
    public GenericCreateViewModel NewObject { get; set;
}

public class GenericCreateViewModel
{
    public string PropertyA { get; set; }
    public string PropertyB { get; set; }
}

在视图中,我循环通过ExistingObjects 来显示所有现有对象,在下面我使用@Html.BeginForm("Index", "GenericController", FormMethod.Post) 创建一个表单,在里面我有适当的@Html.EditorFor(m =&gt; m.NewObject.PropertyA)。查看下面的sn-p:

@model Namespace.Models.Generic.GenericIndexViewModel
...
@if (Model.ExistingObjects.Any())
{
    // Display list of objects
}
...
@using (Html.BeginForm("Index", "GenericController", FormMethod.Post))
{
    @Html.ValidationSummary(true)

    <div class="field-holder">
        @Html.LabelFor(m => m.NewObject.PropertyA)
        @Html.EditorFor(m => m.NewObject.PropertyA)
    </div>

    <div class="field-holder">
        @Html.LabelFor(m => m.NewObject.PropertyA)
        @Html.EditorFor(m => m.NewObject.PropertyA)
    </div>

    <div>
        <input type="submit" value="Save" name="command" />
    </div>
}

动作方法签名如下:

[HttpPost]
public ActionResult Index(GenericCreateViewModel model) { ... }

当我提交表单时,尽管model 参数是null,但它成功触发了操作方法。

当我检查帖子数据时,我可以看到属性以 NewObject 为前缀:

NewObject.PropertyA=test1&NewObject.PropertyB=test2

如何防止前缀,或让操作方法将前缀属性识别为参数?

【问题讨论】:

  • 您的视图中的@model 是什么?
  • 请出示必要的视图相关代码
  • 按要求添加了视图 sn-p。
  • public ActionResult Index([Bind(Prefix = "NewObject ")]GenericCreateViewModel model)
  • @StephenMuecke 请添加您的评论作为答案,因为我相信这可以更准确地解决所提出的具体问题。

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5


【解决方案1】:

尝试将您的编辑器更改为

@Html.EditorFor(m => m.NewObject.PropertyA)

并将您的 Post 操作更改为

[HttpPost]
public ActionResult Index(GenericIndexViewModel model) { ... }

然后访问model.NewObject获取所需的GenericCreateViewModel

或者你可以试试:

<div class="field-holder">
    <label>PropertyA</label>
    <input type="text" name="PropertyA" />
</div>

<div class="field-holder">
    <label>PropertyB</label>
    <input type="text" name="PropertyB" />
</div>
<div>
    <input type="submit" value="Save" name="command" />
</div>

并继续在您的 POST 方法中接收 GenericCreateViewModel 对象。

[HttpPost]
public ActionResult Index(GenericCreateViewModel model) { ... }

这只是实现预期结果的一种方式。

【讨论】:

  • 这个帖子不会回复整个GenericIndexViewModel 包括所有ExistingObjects 数据吗?
  • 经过测试,但没有,只有BeginForm 中的属性会被发布。非常感谢!
【解决方案2】:

默认表单行为会将完整模型发布回您的控制器,因此解决此问题的简单方法是将 post Index 方法中的参数更改为 GenericIndexViewModel

如果您想按原样保留 c# 方法,您需要覆盖数据的格式化方式,并在 onsubmit 事件中自己发出 post 请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2018-10-14
    • 1970-01-01
    • 2011-02-14
    • 2016-05-28
    • 2020-10-12
    相关资源
    最近更新 更多