Форма для модели, отличной от страницы просмотра в ASP.NET MVC 3 - PullRequest
27 голосов
/ 27 марта 2011

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

class Results
{
     ... // some results data to display
}

class EmailSignup
{
    public virtual int Id { get; set; }

    [Required(ErrorMessage = "Please enter your email.")]
    [DataType(DataType.EmailAddress)]
    [RegularExpression(@"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$", ErrorMessage = "Please enter a valid email address.")]
    public virtual string Email { get; set; }
}

Results.cshtml

@model MyApp.Results
[display results]
...
@using (Html.BeginForm("SubmitEmail", "AnalysisResults", FormMethod.Post))
{
     <fieldset>
     @Html.TextBoxFor( model => model.???? )
     </fieldset>
}

Тип, который я хочу отправить пользователю, это EmailSignup, а не Results.

Ответы [ 4 ]

28 голосов
/ 27 марта 2011

Переместить форму в частичное представление, которое принимает модель EmailSignup.

6 голосов
/ 04 сентября 2015

Это можно сделать довольно легко.Вы просто должны сделать это так:

var contactModel = new ContactModel();
@Html.TextBoxFor(m => contactModel.Title)
@Html.ValidationMessageFor(m => contactModel.Title)

Проверка работает как шарм.

2 голосов
/ 23 июня 2015

Вы можете создать еще один HtmlHelper, подобный этому

var emailSignupHtml = new HtmlHelper<EmailSignup>(Html.ViewContext, new ViewDataContainer<EmailSignup>(new EmailSignup()));

и использовать его вот так

@emailSignupHtml.TextBoxFor(m => m.Email)

Для ViewDataContainer я использую следующий вспомогательный класс

public class ViewDataContainer<TModel> : ViewDataDictionary<TModel>, IViewDataContainer
{
   public ViewDataContainer(TModel model) : base (model)
   {
      ViewData = new ViewDataDictionary(model);
   }

   public ViewDataDictionary ViewData { get; set; }
}
1 голос
/ 15 сентября 2011

Полагаю, вы также можете попробовать @ HTML.Action ("EmaialSignup"), и ваш контроллер будет иметь функцию, вызывающую частичное представление, если вам нужно визуализировать ограниченное представление нескольких моделей в этом представлении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...