Подтвердить что ты не робот

Форма для другой модели, чем страница просмотра в ASP.NET MVC 3

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

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][email protected]((\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, а не результаты.

4b9b3361

Ответ 1

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

Ответ 2

Это можно сделать довольно легко. Вам просто нужно сделать это следующим образом:

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

Валидация работает как прелесть.

Ответ 3

Вы можете создать другой 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; }
}

Ответ 4

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