Несколько моделей MVC3 - одна страница - PullRequest
1 голос
/ 15 января 2012

У меня есть страница _layout, в которой есть поле для входа (частичное представление), и у этого представления есть своя собственная модель.Таким образом, контроллер выглядит следующим образом:

        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);
    }

Но как только моей главной странице содержимого требуется модель, мое веб-приложение перестает работать, потому что в поле «Вход» ожидается тип LoginModel, а моя страница содержимого отправляет другую модель.:

Это метод GET для моего главного экрана Index:

 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 '. "

Как мне справиться с этим - моему _layout нужна модель для поля входа в систему.

По запросу, здесь находится cshtml-файл Loginbox.

    @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>

}

И файл 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>

1 Ответ

1 голос
/ 15 января 2012

На подобные вопросы не всегда легче всего ответить, потому что не существует простого решения. Есть несколько вопросов, которые следует учитывать. Если это возможно, я бы порекомендовал вам обрабатывать ошибки проверки логина в отдельном представлении. Частичное представление для небольшого поля входа в систему не требует строго типизированной модели представления.

Идеального решения не существует, но я не думаю, что для вас имеет смысл всегда создавать LoginModel объекты при каждом запросе, который отображает представление, зависящее от _Layout. Приведенное ниже решение защищает создание отдельного представления входа в систему, которое можно использовать для явных попыток входа в систему и для обработки любых ошибок входа в систему.

Если после этого у вас возникнут проблемы, не стесняйтесь ответить на свой вопрос в комментарии, и я сделаю все возможное, чтобы ответить.

Поле для входа

@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>
}

Диспетчер учетных записей

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

public ActionResult RetryLogin()
{
    ModelState.AddModelError(null, "The Username or Password you entered is invalid.  Please try again.");
    return View("Login");
}

[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 RedirectToAction("RetryLogin");
}

Вход в систему

@using (Html.BeginForm("Index", "Account"))
{
    @Html.ValidationSummary()
    <!-- login form here -->
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...