У меня есть страница _layout, у которой есть окно входа (частичный вид), и этот вид имеет свою собственную модель. Таким образом, контроллер выглядит следующим образом:MVC3 Несколько моделей - одна страница
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 для моего основного экрана Индекс:
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 », но для этого словаря требуется элемент модели типа« ГалереяPresentation.Models.LoginModel », «.
Как справиться с этим - My _layout нуждается в модели для окна входа.
В соответствии с запросом, вот файл cboxbox 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>
Пожалуйста включают Войти Box парциальное Просмотреть cshtml. –
@Phil - добавлен код. – Craig
Похоже, я могу использовать мой LoginModel в качестве базового класса для всех остальных моделей, а затем наследовать его? Это похоже на работу - но это хороший дизайн/практика? Мне нужно убедиться, что все модели наследуются от LoginModel (что, я думаю, я переименовал бы в BaseModel - если бы что-то еще понадобилось?). – Craig