如何从部分视图获取模型数据?

时间:2010-09-24 17:00:40

标签: html asp.net-mvc-2 post

我正在创建一个网站,在该网站中我使用部分视图来显示有关单个模型的各种数据。这里有一些HTML。 (注意,所有这些都包含在一个表单中,并且这些部分呈现的索引页面是强类型的主模型。主模型包含各种数据列表。)

<div id="tab1"><% Html.RenderPartial("Tab1", Model); %></div>
<div id="tab2"><% Html.RenderPartial("Tab2", Model.AnItemList1.FirstOrDefault<AnItemList1>()); %></div>
<div id="tab3"><% Html.RenderPartial("Tab3", Model.AnItemList2.FirstOrDefault()); %></div>

以下是部分视图标题之一(对于'tab2'):

<%@ Language="C#" Inherits="System.Web.Mvc.ViewUserControl<AnItem1>" %>

页面显示正确。问题是,当我将数据输入到部分页面的各个部分然后提交整个表单(通过POST)时,数据不会返回到我的数据存储(MSSQL) - 但这只发生在任何一个列表项(包含在模型中)。第一个部分页面在数据存储中正确地设置了数据。

我在这里做错了什么?我应该只将模型传递给Html.RenderPartial,然后在部分页面上获取我需要的特定模型吗?我应该通过整个列表,然后获得第一个(现在,我只关心列表中的第一个项目 - 这将永远改变,但不会很快改变。)

赞赏的建议或想法。

更新:以下是我访问部分视图的属性的方法。

<div class="data-group">
    <%: Html.CheckBoxFor(model => model.Property1) %>
    <%: Html.LabelFor(model => model.Property1) %>
</div> 

更新2 :按请求...

Controller Action(ScenarioController):

    public ActionResult Index(int id = 0)
    {
        if (id == 0)
        {
            SavedScenario scenario = new SavedScenario();
            scenario.AnItemList1.Add(new AnItem1());
            scenario.AnItemList2.Add(new AnItem2());
            return View("Index", scenario);
        }
        else
        {
            SavedScenario scenario = repository.GetScenario(id);

            if (scenario == null)
                return View("NotFound");
            else
                return View("Index", scenario);
        }
    }

    [HttpPost]
    public ActionResult Index(SavedScenario scenario)
    {
        if (ModelState.IsValid && TryUpdateModel(scenario, "SaveScenario"))
        {
            repository.Add(scenario);
            repository.Save();
        }

        return View(scenario);
    }

呈现HTML(我只能包含部分内容 - 这是表单中的一小部分示例):

<form action="/Scenario" id="form0" method="post">
    <!-- This is the one that works - the basic Scenario. Top level. -->
  <fieldset>
    <legend>Scenario Information</legend>

    <div class="data-group">
        <div class="editor-label">
            <label for="ScenarioName">Scenario Name</label>

        </div>
        <div class="option1">
            <input class="wide" id="ScenarioName" name="ScenarioName" type="text" value="" />
        </div>
        <div class="validation">
            <div><span class="field-validation-valid" id="ScenarioName_validationMessage"></span></div>
        </div>
    </div>
  </fieldset>   

<!-- This does not work or get submitted (as far as I can tell). -->
<div id="tab2">
<fieldset>
    <legend>Tab2</legend>
    <div class="data-group">
        <input id="Property1" name="Property1" type="checkbox" value="true" /><input name="Property1" type="hidden" value="false" />
        <label for="Property1" />
    </div> 
</div>
</fieldset>

</form>

我很抱歉不得不保持这种通用。

2 个答案:

答案 0 :(得分:1)

很难从这么多代码中猜出来。但是,您应该确保模型的所有属性在发回服务器时具有相同的前缀

编辑:表单字段名称应与模型的属性名称匹配,以正确绑定所有值。您有两个具有相同名称的字段,您可以按以下方式绑定

[HttpPost]
    public ActionResult Index(SavedScenario scenario, List<bool> Property1)
    {
        // here you can do with values coming in property1
        if (ModelState.IsValid && TryUpdateModel(scenario, "SaveScenario"))
        {
            repository.Add(scenario);
            repository.Save();
        }

        return View(scenario);
    }

答案 1 :(得分:0)

命名部分表单上的字段可能会出现问题。尝试命名部分视图中的字段,方法是在其前面加上传递给它的模型的名称...就像'AnItemList1.name'而不仅仅是'name' ..我只是在猜这里......但那是当我将值变为null时,我有时会解决这个问题。