1

所以我有以下代码:

@model Project.Models.ViewModels.SomeViewModel
@using (Html.BeginForm("SomeAction", "SomeController", new { id = Model.Id}))
        {
            for(int i = 0; i < Model.SomeCollection.Count(); i++)
            {
                @Html.HiddenFor(x => Model.SomeCollection.ElementAt(i).Id)
                <div class="grid_6">
                    @Html.TextAreaFor(x => Model.SomeCollection.ElementAt(i).Text, new { @style = "height:150px", @class = "grid_6 input" })
                </div>
            }
            <div class="grid_6 alpha omega">
                <input type="submit" value="Next" class="grid_6 alpha omega button drop_4 gravity_5" />
            </div>
        }

在控制器端,我有以下内容:

[HttpPost]
        public ActionResult SomeAction(int id, SomeViewModel model)
        {

            return PartialView("_SomeOtherView", new SomeOtherViewModel(id));
        }

我的视图模型是这样设置的:

public class SomeViewModel
{
        public SomeViewModel()
        {

        }
        public IEnumerable<ItemViewModel> SomeCollection { get; set; }

}

public class ItemViewModel{

      public ItemViewModel(){}

      public int Id {get;set;}

      public string Text{get;set;}

}

如果执行 SomeAction,SomeCollection 始终为空。为了显示用户更新的值,我必须做什么。文本属性和 ID 字段。

4

3 回答 3

2

使用EditorTemplate

在您的Views/ YourcontrollerName下创建一个 EditorTemplate 文件夹并创建一个具有名称的视图ItemViewModel.cshtml

在此处输入图像描述

并在该文件中有此代码

@model  Project.Models.ViewModels.ItemViewModel
<p>
 @Html.EditorFor(x => x.Text) 
 @Html.HiddenFor(x=>x.Id)
</p>

现在从您的主视图中,这样称呼它

@model  Project.Models.ViewModels.SomeViewModel
@using (Html.BeginForm("SomeAction", "Home", new { id = Model.Id}))
{
    @Html.EditorFor(s=>s.SomeCollection)
    <div class="grid_6 alpha omega">
        <input type="submit" value="Next" class="grid_6 alpha omega button drop_4 gravity_5" />
    </div>
}

现在在您的HTTPPOST方法中将填充值。

我不确定你想对这些值做什么(返回部分视图?)所以不要对此发表任何评论。

于 2012-08-03T15:47:09.083 回答
0

我不确定您是否已发布所有代码。

您的操作方法不执行任何操作,因为它使用新模型对象返回部分视图(出于某种原因来自 post 调用,而不是 ajax 请求)。

您有效地将模型传递回操作,然后丢弃它,并返回一个新的模型对象。这就是您的收藏总是空的原因,它永远不会设置在任何地方。

于 2012-08-03T15:38:25.640 回答
0

好吧,一方面,为什么你将模型和模型id的属性都发送回控制器?是不是显得有点多余?此外,您正在for视图中使用 javascript 循环。使用它会容易得多@foreach

无论如何,你的问题是,当你告诉一个动作接受一个模型时,它会在postfor 值中查找与模型的每个属性的名称匹配的键。所以,假设我们有以下模型:

public class Employee
{
   public string Name;
   public int ID;
   public string Position;
}

如果我像这样传回去:

@using(Html.BeginForm("SomeAction", "SomeController"))
{
     <input type="text" name = "name" [...] />    //in your case HtmlHelper is doing this for you, but same thing
     <input type="number" name = "id" [...] />
     <input type="submit" name = "position" [...] />
}

要将这个模型传回控制器,我必须这样做:

接受模型

//MVC matches attribute names to form values
public ActionResult SomethingPosted(Employee emp)
{
    //
}

接受一组值

//MVC matches parameter names to form values
public ActionResult SomethingPosted(string name, int id, string postion)
{
    //
}

或这个:

接受 FormCollection

//same thing as first one, but without a strongly-typed model
public ActionResult SomethingPosted(FormCollection empValues)
{
    //
}

因此,这是您的代码的更好版本。

你的新观点

@model Project.Models.ViewModels.SomeViewModel
@{
    using (Html.BeginForm("SomeAction", "SomeController", new { id = Model.Id}))
        {
            foreach(var item in Model)
            {
                @Html.HiddenFor(item.Id)
                <div class="grid_6">
                    @Html.TextAreaFor(item.Text, new { @style = "height:150px", @class = "grid_6 input" })
                </div>
            }
            <div class="grid_6 alpha omega">
                <input type="submit" value="Next" class="grid_6 alpha omega button drop_4 gravity_5" />
            </div>
        }
}

你的新动作

[HttpPost]
public ActionResult SomeAction(int Id, string Text)
{
    //do stuff with id and text
    return PartialView("_SomeOtherView", new SomeOtherViewModel(id));
}

或者

[HttpPost]
public ActionResult SomeAction(IEnumerable<ItemViewModel> SomeCollection)  //can't use someviewmodel, because it doesn't (directly) *have* members called "Id" and "Text"
{
    //do stuff with id and text
    return PartialView("_SomeOtherView", new SomeOtherViewModel(id));
}
于 2012-08-03T15:44:43.453 回答