【问题标题】:Pass updated model to from view to controller using Ajax使用 Ajax 将更新的模型从视图传递到控制器
【发布时间】:2020-09-24 03:22:56
【问题描述】:

我有以下具有学生名字和姓氏属性的简单类。 当加载此模型的视图时,我想添加额外的列来为每一行分配与成本相关的信息,因此我在我的 DOT 类中添加了两个字段,即 StudentDoaminModel。

视图加载正常,但每个新属性 Cost1 和 Cost2 的值没有传递给控制器​​。

我想用ajax把模型传给控制器

学生模型课

public class Student  
{    
    public string first_name{ get; set; }  
    public string last_name { get; set; }      
} 

学生领域模型课

public class StudentDomainModel  
{    
    public string first_name{ get; set; }  
    public string last_name { get; set; }  
    public int Cost1 { get; set; }
    public Decimal Cost2 { get; set; }    
} 

查看

<table id="tblProducts">
    <thead class="text-light bg-dark">
        <tr>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Cost1</th>
            <th>Cost2</th>
        </tr>
    </thead>
    <tbody>
        @if (Model != null)
        {
            for (int i = 0; i < Model.Count; i++)
            {
        <tr>
            
            <td>
                @Html.DisplayFor(m => m[i].first_name)
                @Html.HiddenFor(m => m[i].first_name)
            </td>
            <td>
                @Html.DisplayFor(m => m[i].last_name)
                @Html.HiddenFor(m => m[i].last_name)
            </td>
            <td>
                @Html.TextBoxFor(m => m[i].Cost1)
                @Html.HiddenFor(m => m[i].Cost1)
            </td>
            <td>
                @Html.TextBoxFor(m => m[i].Cost2)
                @Html.HiddenFor(m => m[i].Cost2)
            </td>
            
        </tr>
            }
        }
    </tbody>

ajax 脚本

<script>
$("#export").click(function (event)
{
var object = @(Html.Raw(Json.Encode(Model)));
$.ajax({
        type: 'POST',
        url: '/Student/StudentData',
        data: JSON.stringify({ modelData: object }),
        contentType: 'application/json',
        dataType: 'json',
        success: function (response)
        {
            if (response != '')
                console.log("Success");
        },
        failure: function (response)
        {
            console.log("Failure");
        },
        error: function (response)
        {
            console.log("Error:" + response);
        }
    });
});
</script>

在我的控制器中,Cost1 和 Cost2 都为 0,如何为每列传递新值?

【问题讨论】:

  • 我已经添加了一个答案如果你觉得不清楚,请告诉我,我可以让它更简单,并添加一些带有类的服务器端代码用于反序列化。 @Medhani W.
  • 谢谢@Ghanat 模型是列表类型List&lt;StudentDomainModel&gt; 我要空了,这是我的控制器[HttpPost] public FileStreamResult StudentData(List&lt;StudentDomainModel&gt; modelData) { }
  • 不客气,我完全编辑了答案。并添加一个经过测试的控制器层
  • @Ghanat 非常感谢你,非常感谢你的时间,但我的控制器仍然为空,我将 data: { 'formResult': formJsonData }, 更改为 data: JSON.stringify(formJsonData),,但我的控制器仍然为空
  • @Medhaine W. 我的本地解决方案没有任何问题,我已将我的解决方案上传到 github github.com/mghanatabady/MvcTableFromSample

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


【解决方案1】:

我已经把之前的答案改成了这个:

1- 查看代码:

<table>
    @if (Model != null)
    {

        foreach (var item in Model.ToList())
        {
            <tr class="studentItem">
                <td>
                    @item.first_name
                    @Html.Hidden("first_name", item.first_name)
                </td>
                <td>
                    @item.last_name
                    @Html.Hidden("last_name", item.last_name)
                </td>
                <td>
                    @Html.TextBox("Cost1", item.Cost1)
                </td>
                <td>
                    @Html.TextBox("Cost2", item.Cost2)
                </td>
            </tr>
        }
    }
</table>

<input type="button" id="export" title="export" value="export" />

2- 使用此脚本制作 JSON 字符串 (formJsonData) 表单元素并发送到服务器:

<script>
    $("#export").click(function (event) {


        var formJsonData = "[";

        for (var i = 0; i < $(".studentItem").length; i++) {
            formJsonData = formJsonData + "{";

            var first_name = $("input[name='first_name']")[i];
            formJsonData = formJsonData + "\"first_name\":" + "\"" + first_name.value + "\",";
            var last_name = $("input[name='last_name']")[i];
            formJsonData = formJsonData + "\"last_name\":" + "\"" + last_name.value + "\",";
            var Cost1 = $("input[name='Cost1']")[i];
            formJsonData = formJsonData + "\"Cost1\":" + Cost1.value + ",";
            var Cost2 = $("input[name='Cost2']")[i];
            formJsonData = formJsonData + "\"Cost2\":" + Cost2.value;

            formJsonData = formJsonData + "},";
        }      
        formJsonData = formJsonData + "]";


        $.ajax({
            type: 'POST',
            url: '/Student/StudentData',
            data: { 'formResult': formJsonData },
            success: function (response) {
                if (response != '')
                    console.log("Success");
            },
            failure: function (response) {
                console.log("Failure");
            },
            error: function (response) {
                console.log("Error:" + response);
            }
        });
    });



</script>

3- 我使用了这样的控制器类和一些模拟数据:

public class StudentController : Controller
{
    public ActionResult Index()
    {
        List<StudentDomainModel> list = new List<StudentDomainModel>();
        list.Add(new StudentDomainModel { first_name = "a", last_name = "aa", Cost1 = 11, Cost2 = 12 });
        list.Add(new StudentDomainModel { first_name = "b", last_name = "bb", Cost1 = 21, Cost2 = 22 });
        list.Add(new StudentDomainModel { first_name = "cc", last_name = "cc", Cost1 = 31, Cost2 = 32 });
        list.Add(new StudentDomainModel { first_name = "dd", last_name = "dd", Cost1 = 41, Cost2 = 42 });
        var foo = JsonConvert.SerializeObject(list);
        return View(list);
    }

    [HttpPost]
    public JsonResult StudentData(string formResult)
    {
        List<StudentDomainModel> list = JsonConvert.DeserializeObject<List<StudentDomainModel>>(formResult);
        return null;
    }
}

上传的示例项目: https://github.com/mghanatabady/MvcTableFromSample

【讨论】:

  • 我应该如何在我的控制器中接受?我越来越空了,这是我的控制器[HttpPost] public FileStreamResult StudentData(List&lt;StudentDomainModel&gt; modelData) { }
  • @MedhanieW。我已经改变了答案,我使用了另一种方法并编写了一个控制器。结果通过了测试。现在一切正常!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多