从View查看POST时列表为NULL

时间:2015-06-26 08:15:39

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5

我使用以下操作允许用户查看Excel导入的预览

[HttpGet]
[Authorize]
public ActionResult ImportVerify()
{
    string temp_sessionname = "ImportedData_" + User.Identity.Name;
    List<ProjectImportModel> view_model = (List<ProjectImportModel>)TempData[temp_sessionname];
    return View(view_model);
}
[HttpPost]
[Authorize]
public ActionResult ImportVerify(List<ProjectImportModel> model)
{
    return View(model);
}

在View上我正在使用一个表来显示来自excel的导入数据列表,并要求用户确认导入操作

我的观点是这样的

<h2>Import Verify</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
 //table with all details and a submit button in the end

  <div class="form-group">
    <div class="col-md-10" style="text-align:center;">
        <input type="submit" value="Submit" class="btn btn-primary" />         
    </div>
</div>
}

模特是

public class ProjectImportModel

{      public string Page {get;组; }

 public string Author { get; set; }

 public string Translator { get; set; }

 public string Holder { get; set; }

public string Title { get; set; }

public string TrTitle { get; set; }
//and similar 20 more properties of string type

}

但是在POST上,列表为空

是否可以在POST事件中获取列表。我的意图只是允许用户预览

或者我是否需要从TempData @ post重新填充List?

3 个答案:

答案 0 :(得分:3)

为了发回一个集合,您需要为属性编制索引,如果他们只读取,您可以将HiddenFor与模型一起使用。 如果您希望用户对其进行编辑,请将其更改为TextBoxFor's或更改您需要的控件。

@model List<ProjectImportModel>
<h2>Import Verify</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
 //table with all details and a submit button in the end

  <div class="form-group">
    <div class="col-md-10" style="text-align:center;">
        @for(var i = 0 ; i < Model.Count; i++)
        {
          @Html.HiddenFor(m => m[i].Foo) 
          @Model[i].Foo <br/>
        }
        <input type="submit" value="Submit" class="btn btn-primary" />         
    </div>
</div>
}

我只使用了Foo的虚拟属性而没有看到你的模型。

显然你也想要显示数据。

Model Binding To A List

答案 1 :(得分:1)

我没有看到设置TempData的代码段。所以我打算在另一个Action中设置它,然后重定向到ImportVerify Action

TempData保存HTTP请求时间的信息。这仅意味着从一个页面到另一个页面。这意味着在重定向到您的ImportVerify Get操作后,数据已过期。如果您想保留数据,可以尝试以下方法:

  • 在页面中创建隐藏列表
  • 使用Session代替TempData

答案 2 :(得分:0)

将列表发布回控制器有一些要求。具体来说,索引必须基于0且不间断(例如,您可以使用索引[0],[1],[2]绑定列表,但不能绑定[0],[1],[3]或[1] ,[2],[3]。

或者,您可以编写自定义模型绑定器以按您喜欢的方式解析请求主体。

有关此内容的更多信息:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

编辑: 以下是如何执行此操作的示例:

给出以下模型

public class ExampleModel
{
    public int Field1 {get; set;}
    public string Field2 {get; set;}
}

以下行动

[HttpGet]
[Authorize]
public ActionResult ImportVerify()
{
    List<ExampleModel> model = //populate the list somehow
    return View(model);
}

[HttpPost]
[Authorize]
public ActionResult ImportVerify(List<ExampleModel> model)
{
    //do something
}

示例视图“ImportVerify.cshtml”将是:

@model List<ExampleModel>

@using(Html.BeginForm())
{
    for(var i = 0; i < Model.Count; i++)
    {
       <div>
            @Html.HiddenFor(m => m[i].Field1);
            @Html.HiddenFor(m => m[i].Field2);
            <p>
                Value @i : Field1 = @m[i].Field1 , Field2 = @m[i].Field2
            </p> 
        </div>
    }
    <input type="submit" value="Send"/>
}

另外,我会稍微修改你的逻辑,以避免使用TempData(通常是不好的做法)并允许强类型视图。