MVC3 - частичные представления и проверка сервера связанной с ними модели - PullRequest
0 голосов
/ 04 декабря 2011

Я довольно новичок в MVC3 и у меня есть вопрос об автоматической проверке моделей, выполняемых на стороне сервера.

Мой сценарий: страница указателя, которая имеет частичное представление (назовем ее частичной A) исвязанная модель, скажем, имя клиента.В этом частичном представлении есть еще одно частичное представление (назовем его Частичным B), которое позволяет клиентам вводить любые предыдущие имена, которые у них есть (т. Е. Детали девичьего имени), которое имеет свою собственную модель.

Теперь Частичное B необязательно вчто пользователю не нужно вводить детали, если они этого не хотят, в то время как детали частичного А должны быть введены.

При нажатии кнопки отправки форма, которая включает в себя оба частичных представления, запускает контроллер и соответствующее действие / метод -MVC3 автоматически проверяет частичную модель А.Если я передам обе модели в качестве параметров для действия, то обе они будут проверены.

Однако я хочу проверять модель частичного A каждый раз и только модель частичного B, если клиент добавил подробности.

Итак, я хотел бы знать, какой метод лучше всего использовать для написания кода для этого сценария.
Я вижу, что атрибуты тега формы можно изменить с помощью jquery / javascript, проверив, были ли введены подробности в части B, а затем изменитевызов действия / метода к той, которая принимает обе модели в качестве входных данных.Это лучший способ или есть другой способ, который лучше?Спасибо

Ответы [ 2 ]

1 голос
/ 04 декабря 2011

Вы можете отключить частичные элементы управления страницы b и включить их, если пользователь хочет ввести их. как отключить элементы управления не проходят проверку. Другой вариант, который можно использовать, это использовать условную проверку. Вы можете выполнить условную проверку Google для asp.net mvc, и вы получите много ссылок для справки, которые вы можете увидеть здесь и здесь

0 голосов
/ 06 декабря 2011

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

В этом примере предполагается, что пользователь введет имя, отчество и фамилию.Если введено либо среднее имя, либо фамилия, то необходимо ввести имя.

Модель:

public class IndexModel
{
    [RequiredIfOtherFieldEntered("MiddleName", "Surname", ErrorMessage="Please enter the forename")]
    public string Forename { get; set; }

    public string MiddleName { get; set; }

    public string Surname { get; set; }
}

IndexView:

@model MvcApplication6.Models.IndexModel

<h2>Index</h2>

@using (Html.BeginForm())
{
    <p>Forename: @Html.EditorFor(m => m.Forename) @Html.ValidationMessageFor(m => m.Forename)</p>

    <p>If you enter the middle name or the surname then the forename will be required.</p>

    <p>Middlename: @Html.EditorFor(m => m.MiddleName)</p>

    <p>Surname: @Html.EditorFor(m => m.Surname)</p>

    <input type="submit" value="submit"/>
}

Домашний контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(IndexModel indexModel)
    {
        if (ModelState.IsValid)
        {
            return RedirectToAction("NextPage");
        }
        else
        {
            return View();
        }
    }
}

Настраиваемый атрибут:

public class RequiredIfOtherFieldEnteredAttribute : ValidationAttribute
{
    private string[] properties;

    public RequiredIfOtherFieldEnteredAttribute(params string[] properties)
    {
        if (properties == null && properties.Length < 1)
        {
            throw new ArgumentNullException("properties");
        }

        this.properties = properties;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        foreach (string property in properties)
        {
            //using System.Reflection.PropertyInfo;
            PropertyInfo propertyInfo = validationContext.ObjectType.GetProperty(property);

            if (propertyInfo == null)
            {
                return new ValidationResult(string.Format("Property '{0}' is undefined.", property));
            }

            var propertyValue = propertyInfo.GetValue(validationContext.ObjectInstance, null);

            if (propertyValue != null && !string.IsNullOrEmpty(propertyValue.ToString()))
            {
                if (value == null || string.IsNullOrEmpty(value.ToString()))
                    return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
            }
        }

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