Asp.net mvc MVC3多型号-单页

Asp.net mvc MVC3多型号-单页,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我有一个_布局页面,其中有一个登录框(部分视图),该视图有自己的模型。控制器看起来像这样: public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(LoginModel loginModel) { if(ModelState.IsValid) { var g

我有一个_布局页面,其中有一个登录框(部分视图),该视图有自己的模型。控制器看起来像这样:

        public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(LoginModel loginModel)
    {
        if(ModelState.IsValid)
        {
            var g = new GallaryImage();
            var user = g.LoginUser(loginModel.Username, loginModel.Password);
            if(user != null) 
            {
                FormsAuthentication.SetAuthCookie(user.username, false);
                return RedirectToAction("Index", "Home");
            }
            ModelState.AddModelError("", "Invalid Username/Password");
        }
        return View(loginModel);
    }
但只要我的主内容页需要一个模型,我的web应用程序就会失败,因为登录框需要一个LoginModel类型,但我的内容页正在发送一个不同的模型:

这是我的主索引屏幕的获取方法:

 public ActionResult Index()
    {
        IndexModel model = new IndexModel();
        var g = new GallaryService.GallaryImage();
        var i = g.GetRandomImage();

        if (i != null)
            model.RandomImageUrl = "~/Images/Watermarks/" + i.filename;
            return View(model);
    }
因此,我的主内容页有一个IndexModel,但我的部分视图有一个LoginModel。当我尝试运行它时,我得到一个错误:

传入字典的模型项的类型为“GalleryPresentation.Models.IndexModel”,但此字典需要“GalleryPresentation.Models.LoginModel”类型的模型项

我如何处理这个-我的布局需要登录框的模型

根据要求,这里是Loginbox cshtml文件

    @using GalleryPresentation.Models
@model LoginModel

<script src="../../Scripts/jquery.validate.min.js" type="text/javascript"></script>
@using (Html.BeginForm("index", "Account", FormMethod.Post))
{
    <table class="smallBox">
        <tr>
            <td>@Html.LabelFor(m => m.Username)</td>
            <td>@Html.TextBoxFor(m => m.Username, new { @class = "smallText" })</td>
            <td>@Html.LabelFor(m => m.Password)</td>
            <td>@Html.PasswordFor(m => m.Password, new { @class = "smallText" })</td>
        </tr>
        <tr>
            <td colspan="4" align="right"><input type="submit" value="Login"/></td>
        </tr>
        <tr>
            <td colspan="2">@Html.ValidationSummary()</td>
        </tr>
    </table>

}
@使用GalleryPresentation.Models
@模型逻辑模型
@使用(Html.BeginForm(“index”,“Account”,FormMethod.Post))
{
@LabelFor(m=>m.Username)
@Html.TextBoxFor(m=>m.Username,新的{@class=“smallText”})
@LabelFor(m=>m.Password)
@Html.PasswordFor(m=>m.Password,新的{@class=“smallText”})
@Html.ValidationSummary()
}
Index.cshtml文件(主内容屏幕)具有以下内容:

    @using GalleryPresentation.Models
@model IndexModel
@{
    ViewBag.Title = "Craig and Melanie's Digital Moments";
}

<br/>
<div style="text-align: center">
    <img src="@Url.Content( Model.RandomImageUrl)" alt="@ViewBag.Title" />
</div>
@使用GalleryPresentation.Models
@模型索引模型
@{
ViewBag.Title=“克雷格和梅勒妮的数字时刻”;
}


像这样的问题并不总是最容易回答的,因为没有一个简单的解决方案。但有几个问题需要考虑。如果可能,我建议您在单独的视图中处理登录验证错误。因此,小登录框的部分视图不需要强类型视图模型

没有完美的解决方案,但我不认为总是在每个请求上创建
LoginModel
对象来呈现依赖于布局的视图是有意义的。下面的解决方案提倡创建一个单独的登录视图,用于显式登录尝试和处理任何登录失败

如果您在这方面有任何问题,请随时在评论中回答您的问题,我会尽力回答

登录框

@using (Html.BeginForm("Index", "Account"))
{
    <table class="smallBox">
        <tr>
            <td>Username</td>
            <td>@Html.TextBox("Username", new { @class = "smallText" })</td>
            <td>Password</td>
            <td>@Html.Password("Password", new { @class = "smallText" })</td>
        </tr>
        <tr>
            <td colspan="4" align="right"><input type="submit" value="Login"/></td>
        </tr>
    </table>
}
登录视图

@using (Html.BeginForm("Index", "Account"))
{
    @Html.ValidationSummary()
    <!-- login form here -->
}
@使用(Html.BeginForm(“索引”、“帐户”))
{
@Html.ValidationSummary()
}

像这样的问题并不总是最容易回答的,因为没有一个简单的解决方案。但有几个问题需要考虑。如果可能,我建议您在单独的视图中处理登录验证错误。因此,小登录框的部分视图不需要强类型视图模型

没有完美的解决方案,但我不认为总是在每个请求上创建
LoginModel
对象来呈现依赖于布局的视图是有意义的。下面的解决方案提倡创建一个单独的登录视图,用于显式登录尝试和处理任何登录失败

如果您在这方面有任何问题,请随时在评论中回答您的问题,我会尽力回答

登录框

@using (Html.BeginForm("Index", "Account"))
{
    <table class="smallBox">
        <tr>
            <td>Username</td>
            <td>@Html.TextBox("Username", new { @class = "smallText" })</td>
            <td>Password</td>
            <td>@Html.Password("Password", new { @class = "smallText" })</td>
        </tr>
        <tr>
            <td colspan="4" align="right"><input type="submit" value="Login"/></td>
        </tr>
    </table>
}
登录视图

@using (Html.BeginForm("Index", "Account"))
{
    @Html.ValidationSummary()
    <!-- login form here -->
}
@使用(Html.BeginForm(“索引”、“帐户”))
{
@Html.ValidationSummary()
}

请包含登录框部分视图cshtml。看起来我可以使用我的LoginModel作为所有其他模型的基类,然后继承它?这似乎可行——但这是一个好的设计/实践吗?我需要确保所有模型都继承自LoginModel(我想我会将其重命名为BaseModel-以防需要其他东西?),这是一个选项,但我不建议这样做。将您的LoginModel视为基础模型意味着您的每个视图模型都是LoginModel的扩展。请包含登录框partial view cshtml。看起来我可以将我的LoginModel用作所有其他模型的基础类,然后继承它?这似乎可行——但这是一个好的设计/实践吗?我需要确保所有模型都继承自LoginModel(我想我会将其重命名为BaseModel-以防需要其他东西?),这是一个选项,但我不建议这样做。将您的LoginModel视为基础模型意味着您的每个视图模型都是LoginModel的扩展。这看起来是一个惊人的答案。我不明白Loginbox如何适合于_布局——或者我们是说Loginbox不再位于_布局上,它是一个单独的登录屏幕?我建议您在_布局中使用部分视图,同时使用处理/Account/Login场景的完整视图。在这一点上,部分观点可能不是真正必要的,但将其分开可能仍然有帮助。看起来是一个令人惊讶的答案。我不明白Loginbox如何适合于_布局——或者我们是说Loginbox不再位于_布局上,它是一个单独的登录屏幕?我建议您在_布局中使用部分视图,同时使用处理/Account/Login场景的完整视图。在这一点上,部分观点可能没有真正的必要,但将其分离出来可能仍然有帮助。