查看控制器数据传递

view to controller data passing

当我 select 下拉列表 selected 下拉列表值未出现在控制器操作方法中时。 selected 值在 ajax 中绑定但在控制器操作方法中未绑定 see our page

<div class="row">
  <div class="col-lg-3">
    <fieldset class="form-group">
      <label class="form-label semibold control-label">Generic</label> 
      @Html.DropDownList("MasterGenericID", null, "--- Select Generic ---", new { @class = "select2-arrow" })
    </fieldset>
  </div>
$('#btnsearch').click(function() {
  var genericID = $('#MasterGenericID').val();
  $.ajax({
    type: 'POST',
    url: "@Url.Action("ProductMasterController", "ProductMasterview")",
    data: JSON.stringify(GenericID),
    contentType: "application/json",
    dataType: 'json',
    success: function(data) {
      // if (response.id > 0)
      alert("test" + data.GenericID);
    },
    async: true // make it true if you want to make an async call.
  });
});
public ActionResult ProductMasterview(string GenericID)
  if (Convert.ToInt32(GenericID) > 0) 
  {
    return View(dPMSP.GetAllProductsUsingGenericID(GenericID));
  } 
  else 
  {
    Generic_Bind();
    Therapeutic_Bind();
    SubTherapeutic_Bind();
    Formulation_Bind();
    return View(dPMSP.GetAllProducts());
  }
}

Error page

谢谢

您直接将值传递给 ajax 调用,您应该传递具有 GenericID 属性

的对象

示例-

    $('#btnsearch').click(function () {
    var value = $('#MasterGenericID').val();

    var data = {
        GenericID: value
    };

    $.ajax({
        type: 'POST',
        url: "@Url.Action("ProductMasterview", "ProductMaster")",
        data: JSON.stringify(data),
        contentType: "application/json",
        dataType: 'json',
        success: function(data) {
            // if (response.id > 0)
            alert("test" + data.GenericID);
        },
        async: true // make it true if you want to make an async call.
    });
});

js应该是这样的

$('#btnsearch').click(function() {
  var genericID = $('#MasterGenericID').val();
  var postData={
               GenericID:genericID
               };
  $.ajax({
    type: 'POST',
    url: '@Url.Action("ProductMasterController", "ProductMasterview")',
    data: postData,
    dataType: 'json',
    success: function(data) {
      // if (response.id > 0)
      alert("test" + data.GenericID);
    },
 error: function(xhr, ajaxOptions, thrownError) {
                                    alert('Failed to delete');
                                }
  });
});

并且 C# 代码应该如下所示

[HttpPost]
public ActionResult ProductMasterview(string GenericID)
{
  if (Convert.ToInt32(GenericID) > 0) 
  {

    //return View(dPMSP.GetAllProductsUsingGenericID(GenericID));
    //you can return only the genericId as you expect it at ajax success
    return Json(new { GenericID = yourGenericId});
  } 
  else 
  {
    Generic_Bind();
    Therapeutic_Bind();
    SubTherapeutic_Bind();
    Formulation_Bind();
    //return View(dPMSP.GetAllProducts());
    //you can return only the genericId as you expect it at ajax success

    return Json(new { GenericID = yourGenericId});
  }
}

您的代码有很多问题。

看看这条线

data: JSON.stringify(GenericID),

您正在使用一个变量 GenericID,但它没有在任何地方定义。请记住 javascript 区分大小写 。因此,请确保您使用的大小写正确。

现在看看这一行

url: '@Url.Action("ProductMasterController", "ProductMasterview")',

您未正确使用 Url.Action 辅助方法。如果您使用的重载有两个参数,第一个参数应该是动作名称,第二个应该是控制器名称。您也不需要 Controller 后缀。所以应该是

url: "@Url.Action("ProductMasterview", "ProductMaster")",

我注意到的另一个问题是,您将 ajax 调用的数据类型 属性 指定为 json$.ajax 方法使用此 属性 值来解析来自服务器的数据。此处您告诉 $.ajax 您期望来自服务器的 JSON 响应。但是您的操作方法是 return 查看结果,它是 HTML/Plain 文本,而不是 JSON。因此您的代码将无法按预期工作。

我还看到您正在进行 POST 调用,但您的操作方法未使用 HttpPost 属性修饰。所以你的 ajax 调用不会命中 action 方法。从你的问题中也不清楚你想要什么类型的数据 return.(JSON / View result-HTML).

如果您正在 return 查看结果(html 标记),您应该 return 查看部分视图结果,以便您可以使用它来更新部分视图你的 DOM。 如果您正在 return 浏览整个视图,那么进行 ajax 调用是没有意义的(当我看到 [=21] 中的 4 个方法调用时,我觉得您正在尝试这样做=] 部分在您的操作方法代码中)。

还要使用正确的数据类型。如果要传递数值,请使用数字类型(intlong),而不是使用 string 作为参数并稍后进行转换。请记住,当您传递给它的值无法安全地转换为 int 时,Convert.ToInt32 会抛出异常(例如:12abc)。

使用int作为参数类型。

public ActionResult ProductMasterview(int genericId)
{
    // some other logic you want to do .
    return PartialView(dPMSP.GetAllProductsUsingGenericID(genericId));
}

您应该更新 GetAllProductsUsingGenericID 方法以也采用 int 类型,而不是字符串。

现在在您的客户端,您可以在数据中传递选定的选项值属性。由于您的操作方法未使用 HttpPost 属性修饰,因此只需使用 GET($.ajax 的默认类型)。同时在 js object 中发送选定的选项值,键与您的操作方法参数名称匹配。

$('#btnsearch').click(function() {
    var id = $('#MasterGenericID').val();
    $.ajax({
        url: "@Url.Action("ProductMasterview", "ProductMaster")",
        data: { genericId: id }  
    }).done(function(response) {
        console.log('Received response from server');
        console.log(response);
        // If you want to update the DOM with the response
        // Ex : $("#SomeDomElementId").html(response);
    }).fail(function(x, a, e) {
        alert(e);
    });
});

如果您想从您的操作方法中 return JSON,那很好。您不必一定要指定 dataType 属性,因为 jQuery 会尝试根据响应 headers 智能地猜测它。