MVC将通用列表传递给JS文件中的控制器操作

时间:2012-09-19 15:51:39

标签: jquery model-view-controller

我有一个文本文件,当用户上传文件时,控制器操作方法使用状态机解析该文件,并使用通用列表存储一些值。我以隐藏字段的形式将其传回页面。然后,用户可以单击调用JS模式拨号框的链接,他们可以看到列表并为列表中的每个项添加注释。当他们点击链接时,我试图发布一个动作方法,该方法将采用该隐藏字段并对其执行某些操作并渲染局部视图。问题是,当我发布到此操作方法时,此字段将作为null传递。

这是我的代码

@Html.HiddenFor(model => model.ExceptionString)



if (Model.ExceptionString != null)
           {
               if (Model.ExceptionString.Count > 0)
               {
        <div class="bodyContent">
            <span class="leftContent">
                @Html.Label("Test Exceptions")
            </span><span class="rightContent"><span id="TestExceptionChildDialogLink" class="treeViewLink">Click
                here to View Test Exceptions</span>
                <br />
                <span id="TestExceptionDisplay"></span>
                @Html.HiddenFor(model => model.ExceptionString)
                <input id="ExceptionString" type="hidden" value="@Model.ExceptionString" />
            </span>
        </div>
               }
           }

<div id="testExceptiontreeview" title="Dialog Title" style="font-size: 10px; font-weight: normal;
    overflow: scroll; width: 800px; height: 450px;">
    <div id="testExceptions">

    </div>
    <div id="inputTestExceptions" style="display: none;">
    </div>
</div>


  var runlogTestExceptionUrl = '@Url.Action("ListTestExceptions", "RunLogEntry")';

JS FILE

 $("#inputTestExceptions").load(runlogTestExceptionUrl, { ExceptionStrings: $("#ExceptionString").val() });

控制器操作

[HttpPost]
        public ViewResult ListTestExceptions(List<string> ExceptionStrings)
        {

关于为什么异常字符串列表在被JS传递给abive action方法时为null的任何想法?

1 个答案:

答案 0 :(得分:1)

$("#ExceptionString").val()将返回一个字符串。这意味着您对.load的调用只是将一个名称/值对发布到您的MVC应用程序。

您需要发布一组名称/值对。名称将相同:带索引器的集合的名称。该值将是异常字符串。这将需要一些重大的重构。

这是基本的方法:

查看代码:

<form action="@Url.Action("ListTestExceptions", "RunLogEntry")" TYPE="POST">
@{ int counter = 0;}
@foreach(var exception in Model.ExceptionString)
{

  <input id='@("ExceptionString["+counter+"]")' type="hidden" value='@exception' />
  @{ counter =counter + 1; }
}
</form>

JS代码:

$.ajax({
        url: runlogTestExceptionUrl,
        data: $(this).serialize(),
        success: function(data) {
             $('#inputTestExceptions').html(data);
        }
});

控制器动作不变:

[HttpPost]
    public ViewResult ListTestExceptions(List<string> ExceptionStrings)
    {

显然,这不会立即与您的代码集成。但这将是在MVC中将数据从表单发布到单个集合变量的方法。

注意:我对剃刀语法有点生疏,所以可能会有一些语法问题。当我找到它们时,我会解决它们。