代码之家  ›  专栏  ›  技术社区  ›  JasCav

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

  •  2
  • JasCav  · 技术社区  · 14 年前

    我正在创建一个站点,在这个站点中,我使用局部视图来显示关于单个模型的各种数据位。这里有一点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 :每个请求…

    控制器动作(场景控制器):

        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 回复  |  直到 11 年前
        1
  •  1
  •   DrYap    11 年前

    [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);
        }
    
        2
  •  0
  •   Vishal    14 年前

    'AnItemList1.name' 'name'