После стольких лет использования ASP.Net я все еще пытаюсь понять, как добиться тех же результатов с помощью MVC.
У меня есть materpage с элементом управления, который строго для чего-то типа. Когда я перехожу к представлению другой модели строго типа ... и нажимаю кнопку, чтобы выполнить что-то, я получаю «Элемент модели, переданный в словарь, имеет тип Site.Models.RegisterModel ', но для этого словаря требуется модель элемент типа Site.Models.LogOnModel '".
В этом примере мы можем взять приложение MVC по умолчанию, которое поставляется с VS 2010, давайте представим, что я хочу изменить «LogonUserControl.ascx», чтобы он либо сообщал мне зарегистрированному пользователю (как он работает в настоящее время) ) ИЛИ позвольте мне войти в систему оттуда, показывая мне текстовые поля для имени пользователя и пароля (следовательно, в этом случае с домашней страницы).
Поэтому я беру управление и строго набираю его как:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Gioby.Models.LogOnModel>" %>
<%
if (Request.IsAuthenticated) {
%>
Welcome <b><%: Page.User.Identity.Name %></b>
[ <%: Html.ActionLink("Log Off", "LogOff", "Account")%> ]
<%
}
else {
%>
<% using (Html.BeginForm()) { %>
<div id="logon">
<div class="editor-label">
<%: Html.LabelFor(m => m.UserName)%>
<%: Html.TextBoxFor(m => m.UserName)%>
<%: Html.ValidationMessageFor(m => m.UserName, "*") %>
<%: Html.LabelFor(m => m.Password)%>
<%: Html.PasswordFor(m => m.Password)%>
<%: Html.ValidationMessageFor(m => m.Password, "*") %>
<input type="submit" value="Log On" />
</div>
<div class="editor-label">
<%: Html.ActionLink("Register here", "Register", "Account")%>
<%: Html.CheckBoxFor(m => m.RememberMe, new { @class = "pad-left" })%>
<%: Html.LabelFor(m => m.RememberMe) %>
</div>
</div>
<% } %>
<%
}
%>
Затем на HomeController я добавляю процедуру как:
[HttpPost]
public ActionResult Index(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
// ==>> Check Login against your DB
// Now check if param returnUrl is empty
if (!String.IsNullOrEmpty(returnUrl))
return Redirect(returnUrl);
return RedirectToAction("Index", "Home");
}
// If we got this far, something failed, redisplay form
return View(model);
}
Я проверил это с домашней страницы ... это работает !!!
НО, когда я перехожу к представлению «Register» (помните, что «LogonUserControl.ascx» находится внутри «MasterPage», поэтому виден из представления «Register»).
Поэтому, когда я нажимаю кнопку «Регистрация», я получаю сообщение об ошибке:
Элемент модели, передаваемый в словарь, имеет тип Site.Models.RegisterModel ', но для этого словаря требуется элемент модели типа Site.Models.LogOnModel'.
ВОПРОС:
Означает ли это, что я никогда не смогу объединить части в одно представление?
Допустим, я хочу написать сайт электронной коммерции, и на главной странице я хочу видеть «Самые используемые теги», «Самые покупаемые продукты», «Продукт месяца», «Список категорий»… все в одном и том же просматривать и каждый со своим собственным действием HTTP POST.
Если это возможно с использованием MVC?