【问题标题】:MVC 3 Get result from partial view into modelMVC 3从局部视图中获取结果到模型中
【发布时间】:2012-05-03 16:57:38
【问题描述】:

我确定这很容易,但也许我没有很好地搜索......

我想知道如何将部分视图的结果返回给模型和/或控制器。

如果用户输入名字、性别(从下拉列表中)和等级(从下拉列表中),我只能在模型中找到名字和性别。我想知道如何从局部视图中的下拉菜单中获取等级,一直返回到模型中,这样我就可以在控制器中看到它。

请在控制器代码中寻找这个问题:

我需要做什么才能让部分类的 GradeLevel 出现在此处:

注意:这不是确切的代码。可能有一些小的、无关紧要的错字。

编辑:显然你不能添加长评论,所以我会在这里添加:

谢谢你,汤姆和神秘人。汤姆让我思考为什么它不起作用。我没有考虑模型绑定。通过我提出的设计,HTML 被渲染,并且 Grade 下拉列表有这个 id:“Grade”。我要绑定的模型上的属性是:“GradeLevelID”。如果我将部分视图中的帮助程序更改为 @Html.DropDownList("GradeLevelID" ... 它可以完美运行。

但这不是一个好的解决方案。我的想法是从主视图中抽象出部分视图。硬编码的名字吹了!我确实制定了一个稍微改进的解决方案。在主视图中,我更改了@Html.Partial 语句以将模型属性名称传递给部分。像这样:

@Html.Partial("GradeDropDown", (SelectList)Model.GradeSelectList, new ViewDataDictionary { { "modelPropertyName", "GradeLevelID" } })

然后我可以将部分视图更改为说

@model System.Web.Mvc.SelectList
@Html.DropDownList((string)ViewData["modelPropertyName"], Model)

但这似乎也是一种愚蠢的处理方式。谢谢您的帮助。我会看看 EditorTemplates。


这是我的模型:

public class RegisterModel{

    public MemberRegistration MemberRegistration{
        get{
            if (HttpContext.Current.Session["MemberRegistration"] == null){
                return null;
            }
            return (MemberRegistration)HttpContext.Current.Session["MemberRegistration"];

        }

        set{
            HttpContext.Current.Session["MemberRegistration"] = value;
        }

    }

    public string FirstName{
        get{
            return MemberRegistration.FirstName;
        }
        set{
            MemberRegistration.FirstName = value;
        }
    }

    public SelectList GenderSelectList{
        get{

            List<object> tempList = new List<object>();

            tempList.Add(new { Value = "", Text = "" });
            tempList.Add(new { Value = "M", Text = "Male" });
            tempList.Add(new { Value = "F", Text = "Female" });

            return new SelectList(tempList, "value", "text", MemberRegistration.Gender);
        }
    }

    [Required(ErrorMessage = "Gender is required")]
    public string Gender{
        get{
            return MemberRegistration.MemberPerson.Gender;
        }
        set{
            MemberRegistration.MemberPerson.Gender = value;
        }
    }

    public SelectList GradeLevelSelectList{
        get{
            List<object> tempList = new List<object>();

            tempList.Add(new { Value = "", Text = "" });
            tempList.Add(new { Value = "1", Text = "1st" });
            tempList.Add(new { Value = "2", Text = "2nd" });
            tempList.Add(new { Value = "3", Text = "3rd" });
            tempList.Add(new { Value = "4", Text = "4th" });

            return new SelectList(tempList, "value", "text", MemberRegistration.GradeLevel);
        }
    }

    [Required(ErrorMessage = "Grade is required")]
    public Int32 GradeLevel{
        get{
            return MemberRegistration.GradeLevel;
        }
        set{
            MemberRegistration.GradeLevel = value;
        }
    }
}

这是我的主要观点:

@model RegisterModel

@using (Html.BeginForm())
{
   <p class="DataPrompt">
        <span class="BasicLabel">First Name:</span>
        <br />
        @Html.EditorFor(x => x.FirstName)
    </p>

    <p class="DataPrompt">
        <span class="BasicLabel">Gender:</span>
        <br />
        @Html.DropDownListFor(x => x.Gender, Model.GenderSelectList)
    </p>

    <p class="DataPrompt">
        <span class="BasicLabel">Grade:</span><span class="Required">*</span>
        <br />
        @Html.Partial("GradeDropDown", (SelectList)Model.GradeLevelSelectList)
    </p>

    <p class="DataPrompt">
        <input type="submit" name="button" value="Next" />
    </p>

}

这是我的局部视图(名为“GradeDropDown”):

@model System.Web.Mvc.SelectList

@Html.DropDownList("Grade", Model)

这是我的控制器:

[HttpPost]
public ActionResult PlayerInfo(RegisterModel model)
{
    string FirstName = model.Registration.FirstName;
    string Gender = model.Registration.Gender;

    >>>>> What do I need to do to get the GradeLevel from the partial class to be here: <<<<<
    Int32 GradeLevel = model.Registration.GradeLevel;           

    return RedirectToAction("Waivers");
}

【问题讨论】:

  • 首先将RegisterModel 而不是SelectList 传递给您的局部视图,这样您就可以使用DropDownListFor。这样,它将使用正确的元素命名,以便正确发布。
  • 我不想将 RegisterModel 传递给局部视图,因为我试图找出一种方法让局部视图不需要知道主视图中的模型类型.我正在创建局部视图,以便它可以与不同的视图和模型一起使用。还有其他模型需要我的等级。
  • @user886740 - 您使用了错误的工具。你不使用局部视图来做你想做的事情。您应该使用 EditorTemplates,或者 RenderActions。部分应仅用于简单的“包含”类型替换。

标签: asp.net-mvc-3


【解决方案1】:

我什至不知道您为什么要使用局部视图。您所做的只是使用一种辅助方法,您可以将部分视图替换为视图中的辅助方法,这样代码会更少。

其次,你应该使用Html.DropDownListFor()而不是Html.DropDownList(),然后它会为你正确命名html控件。

这样做:

<p class="DataPrompt"> 
    <span class="BasicLabel">Grade:</span><span class="Required">*</span> 
    <br /> 
    @Html.DropDownListFor(m => m.GradeLevel, (SelectList)Model.GradeLevelSelectList) 
</p> 

【讨论】:

  • 好的,谢谢你的建议。您可能会注意到这正是我对“性别”下拉菜单所做的。但是,我的目标是学习如何将数据从局部视图传递回模型。当我实际将其投入生产时,我的情况会更加复杂。
  • @user886740 - 您不会将数据从部分传递到模型。部分仅在理论上是分开的,它们与主视图一起渲染到单个视图中,因此数据从部分发布,就像主视图中的任何数据一样。它们不是独立的东西。
【解决方案2】:

尝试这样做,以便在发布元素时获得正确的元素命名。

在你的主视图上

 @Html.Partial("GradeDropDown", Model) //Pass the Model to the partial view

这是您的局部视图(名为“GradeDropDown”):

 @model RegisterModel

   @Html.DropDownList("Grade", (SelectList)Model.GradeLevelSelectList)

【讨论】:

  • 我希望这样做。首先,局部视图的模型不匹配。所以我把它改成:@model RegisterModel。这允许智能感知接受 Model.GradeLevelSelectList。
猜你喜欢
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
相关资源
最近更新 更多