【问题标题】:How to get Model value in javascript function and pass it to controller?如何在javascript函数中获取模型值并将其传递给控制器​​?
【发布时间】:2017-11-19 14:29:17
【问题描述】:

我的 CSHTML 页面上有一个模型,我使用这种方式:

@model Web.Models.Element

@using (Html.BeginForm("Search", "Company"))
{
@Html.HiddenFor(c => c.Person)

<div class="panel panel-default">
    <div class="panel-heading"> Company Search</div>
    <div class="panel-body collapse" id="screenCompanySearch">
        <form id="formSearch" name="formSearch" method="post">
            <fieldset style="margin: 20px;">
                <legend>Search</legend>

                <div class="row">
                    <div class="col-xs-2 col-sm-2">
                        @Html.Label("Company Name")
                        @Html.TextBoxFor(c => c.Company.Name, new { @class = "form-control" })
                    </div>
           </fieldset>
        </form>
    </div>
</div>

我的 Javascript 函数是通过这样的按钮单击调用的:

$("#btnSearch").on("click", function() { searchCompany(); })'

在我的 JavaScript 函数中,我需要让这个模型完全加载 TextBoxFor 值:

<script type="text/javascript">
function searchCompany() {
   var data = $("#formSearch").serialize();
    $.ajax({
        url: "@(Url.Action("SearchCompany", "Company"))",
        cache: false,
        data: data,
        type: "POST",
        success: alert("sucesso!")
    });
}
</script>

我的 Controller 方法正在正确加载,但在 Ajax“数据”参数中传递的模型未填充 TextBoxFor 值。

这是视图的控制器 ActionResult:

public ActionResult Consulta()
    {
        Element model = new Element();
        model.Person = new Person();

        return View(model);
    }

发生的情况是我的模型正在我的控制器上实例化,但来自 TextBoxFor 的值没有记录在模型的属性中。

我该如何解决这个问题?现在谢谢。

更新

<div class="col-xs-2 col-sm-2">
     @Html.Label("Person Name")
     @Html.TextBoxFor(c => c.Person.Name, new { @class = "form-control" })
</div>

所以,'c' 等于我的 Element 对象。当我到达控制器方法“搜索”时,通过 ajax 调用传递的参数 Element 不会实例化 Element.Person 这给我 Person = null。

在我的 ActionResult 我有:

Element model = new Element();
model.Person = new Person();

元素类:

public Element()
{
    this.Contacts = new List<Contact>();
    this.DataType = new DataType();

}

public int ID_Element { get; set; }
public int ID_ElementType { get; set; }

public virtual List<Contact> Contacts { get; set; }
public virtual DataType DataType { get; set; }
public virtual Person Person {get; set; }

控制器动作

[HttpPost]
public JsonResult SearchCompany(Element model)
{
    ...
}

【问题讨论】:

  • 您在哪里以及如何调用searchCompany js 方法?你传递给它什么?
  • 像我的脚本部分这样: $("#btnSearch").on("click", function() { searchCompany(model) }); @Shyju
  • 那里的model 是什么?那是你的 js 对象吗?将相关代码添加到您的原始问题中。
  • 您是否尝试通过您的 ajax 调用将相同的模型(Element 对象)发送回服务器,但 Company.Name 属性值填充了文本框值?你为什么要那样做?如果你正在搜索。您所需要的只是搜索键。仪式?为什么你需要整个模型?
  • 参数上其实是“型号”。通过这样做@model Web.Models.Element 我的对象模型它已经准备好在我的页面上使用,对吗?一旦我在 Controller 上的 ActionResult 方法上实例化它。

标签: javascript c# ajax asp.net-mvc


【解决方案1】:

serialize 方法没有提供表单的序列化版本,因为您有嵌套的表单标签。

@using (Html.BeginForm("Search", "Company")) 将创建一个外部表单标记,并且您在其中有另一个表单,因此创建了一个嵌套表单结构。嵌套表单无效。同一页面中可以有 2 个表单,彼此平行,不嵌套。

如果你修复了嵌套表单问题,序列化方法将为你的表单输入提供有效的字符串。

@using (Html.BeginForm("Search", "Company"))
{
   <!-- Your other form -->
}

<form id="formSearch" name="formSearch" method="post">
    <fieldset style="margin: 20px;">
        <legend>Search</legend>

        <div class="col-xs-2 col-sm-2">
            @Html.Label("Company Name")
            @Html.TextBoxFor(c => c.Company.Name, new { @class = "form-control" })
        </div>
    </fieldset>
</form>

请记住,serialize 方法将为您提供此特定表单内项目的输入元素值。如果您想发送一些其他数据(例如:Id),您需要将其保存在此表单内的输入字段中。

【讨论】:

  • 不错!现在我的数据对象填充了输入字段中的值!但是现在在我的 Controller 方法中,我应该接收哪个对象作为参数?我的意思是,我必须做些什么才能将这个序列化对象从表单转换为控制器上我想要的模型?
  • 如果你使用Element作为你的action方法的参数,模型绑定器将能够将发布的数据映射到它。
  • 太棒了!在我的 Element 对象中,我有一个即将为 null 的对象 Person,甚至在控制器操作方法上执行此操作: Element model = new Element();和 model.Person = new Person();为什么会这样?
  • 您必须在表单中包含 Person 对象属性的输入元素,以便模型绑定器也会初始化该属性。
  • 在我的序列化对象中,Element.Person.Name 填充了输入值,但是当我到达控制器操作方法时,参数上传递的对象包含 Element.Person = null。我会用额外的代码更新问题。
猜你喜欢
  • 2013-05-30
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多