【问题标题】:Model not getting assigned values on form submit模型在提交表单时没有获得赋值
【发布时间】:2019-10-15 02:28:48
【问题描述】:

我是 MVC 新手,我的控制器中有以下 ActionMethod:

 public async Task<ActionResult> ViewSsoProviders(int? page, string nameFilter = "", string bpIdFilter = "",
        string protocolFilter = "")

在我看来,我正在尝试通过以下形式调用它:

@{
using (Html.BeginForm("ViewSsoProviders", "SsoAdmin", new
{
    page = 1,
    nameFilter = Model.ProviderNameFilter,
    bpIdfilter = Model.BusinessPartnerIdFilter,
    protocolFilter = Model.ProtocolFilterSelection
}))
{
    <div id="providerForm">
        @Html.ValidationSummary()
        <div class="form-group row">
            <span class="col-sm-4">
                @Html.LabelFor(m => m.ProviderNameFilter)
                @Html.TextBoxFor(m => m.ProviderNameFilter, new {@class = "form-control"})
            </span>
            <span class="col-sm-4">
                @Html.LabelFor(m => m.BusinessPartnerIdFilter)
                @Html.TextBoxFor(m => m.BusinessPartnerIdFilter, new {@class = "form-control", style = "display: block"})
            </span>
            <span class="col-sm-4">
                @Html.LabelFor(m => m.ProtocolFilterOptions)
                @Html.TranslatedDropDownListFor(m => m.ProtocolFilterSelection, Model.ProtocolFilterOptions, new {id = "ddlProtocols", @class = "form-control"})
            </span>
        </div>
        <button class="btn" type="submit" value="Filter">@Html.Translate("Filter")</button>
    </div>

该方法正在被命中,但是,过滤器尚未分配值,我可以硬编码“页面”变量,它将以正确的值到达我的控制器,因此问题不在于路由本身。这里有什么明显的原因为什么我的路由变量无法被赋值?

编辑:值得注意的是,如果我改为传递 'null' 而不是视图中的任何路由值,我可以将模型传递给控制器​​,而只有表单上的字段分配了数据。

【问题讨论】:

  • 您从 RouteData.Values["page"] 得到什么结果?
  • @Kadir 当表单点击它并且页面没有出现在值列表中时,我评估了控制器中的 RouteData,我的任何其他预期变量也没有。
  • 你为什么不直接删除你在方法中添加的所有 fitler 并简单地将其传递给视图模型?
  • @JamesS 感谢您的建议,但是我在结果表上进行了分页,如果您移至下一页,它不会携带过滤器,我知道如果我可以通过过滤器,分页将有效这边走。我可能不得不重新考虑架构,但有几次我感觉非常接近正确答案。 MVC 非常有用,但也可能令人沮丧。

标签: c# html .net asp.net-mvc model-view-controller


【解决方案1】:

您提交的表单应该是一个帖子。你应该有一个新方法并用:

[HttpPost]

并使用包含您需要获取的属性的另一个模型或视图模型对其进行参数化。

例如

[HttpPost]
public ActionResult ViewSsoProviders(MyViewModel model)
{
     //Do a redirection to ViewSoProviders
     //ex.
     return RedirectToAction("ViewSsoProviders", new {nameFilter = model.NameFiler, bpIdFilter = model.BpIdFilter, protocolFilter= model.ProtocolFilter });
}

并在剃刀视图上指定表单方法:

Html.BeginForm("ViewSsoProviders", "SsoAdmin", FormMethod.Post, new
{
    page = 1,
    nameFilter = Model.ProviderNameFilter,
    bpIdfilter = Model.BusinessPartnerIdFilter,
    protocolFilter = Model.ProtocolFilterSelection
}))

【讨论】:

  • @Luke_Villanueva 这就是我想要的,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2019-03-08
相关资源
最近更新 更多