Можно ли повторно использовать действие удаленной проверки в MVC3 - PullRequest
2 голосов
/ 22 ноября 2011

Я использую атрибут удаленной проверки в моей модели представления для проверки банковского счета, указанного для моей компании:

ViewModel:

[Remote("CheckDefaultBank", "Company")]
    public string DefaultBank
    {

Это в контроллере у меня:

    [HttpGet]
    public JsonResult CheckDefaultBank(string defaultBank)
    {
        bool result = BankExists(defaultBank);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

Это все работает хорошо. Но у меня есть еще два банка, связанных с моей компанией. Однако, когда удаленная проверка js вызывает действие, он использует параметр, сопоставляющий имя поля «DefaultBank» ... поэтому я использую это в качестве параметра в своем действии.

Есть ли какой-нибудь атрибут, который я могу добавить в представление, чтобы оно использовало параметр скажем "bankId" в get ajax, поэтому мне не нужно действие для каждого поля, которое в основном точно такое же?

Целью здесь является устранение необходимости иметь это в моем контроллере:

[HttpGet]
    public JsonResult CheckRefundBank(string refundBank)
    {
        bool result = BankExists(defaultBank);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

[HttpGet]
    public JsonResult CheckPayrollBank(string payrollBank)
    {
        bool result = BankExists(defaultBank);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

Я надеялся, что смогу сделать что-то подобное в представлении:

@Html.EditorFor(model => model.DefaultBank, new { data-validate-parameter: bankId })

Таким образом, я мог бы просто использовать одно и то же действие для всех записей Банка, например:

[HttpGet]
    public JsonResult CheckValidBank(string bankId)
    {
        bool result = BankExists(bankId);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

возможно?

Ответы [ 3 ]

3 голосов
/ 22 ноября 2011

Для такой ситуации я написал RemoteReusableAttribute, который может быть вам полезен. Вот ссылка на него: Пользовательская удаленная проверка в MVC 3

2 голосов
/ 22 ноября 2011

Рассмотрите возможность инкапсуляции логики «BankExists» в этом случае в атрибут ValidationAttidator (валидатор аннотаций данных). Это позволяет и другие сценарии.

Затем используйте обертку ActionResult, подобную приведенной ниже, которая позволяет передавать любой валидатор.

[HttpGet]
public ActionResult CheckRefundBank(string refundBank)
{
    var validation = BankExistsAttribute();
    return new RemoteValidationResult(validation, defaultBank);
}

Вот код для ActionResult, который обычно работает с валидаторами.

    using System.ComponentModel.DataAnnotations;
    using System.Web.Mvc;

    public class RemoteValidationResult : ActionResult
    {
        public RemoteValidationResult(ValidationAttribute validation, object value)
        {
            this.Validation = validation;
            this.Value = value;
        }

        public ValidationAttribute Validation { get; set; }

        public object Value { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            var json = new JsonResult();
            json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

            if (Validation.IsValid(Value))
            {
                json.Data = true;
            }
            else
            {
                json.Data = Validation.FormatErrorMessage(Value.ToString());
            }

            json.ExecuteResult(context);
        }
    }

В качестве дополнительного усовершенствования рассмотрите возможность создания метода расширения контроллера, чтобы еще больше высушить ваш обратный вызов.

2 голосов
/ 22 ноября 2011

Поскольку MVC для этого использует связыватель модели по умолчанию, как и обычный метод действия.Вы можете взять FormsCollection в качестве параметра и найти значение.Однако лично мне было бы намного проще просто использовать несколько параметров для функции, если только у вас не появятся десятки различных параметров.

Вы также можете написать пользовательский механизм связывания модели, который переведет переданный параметр вуниверсальный.

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