2013-11-06 3 views
2

Мне нужно использовать удаленную проверку в моем логическом поле. У меня есть вид модели, которая выглядит следующим образом:Удаленная проверка с помощью переключателя в asp.net mvc

public class ViewModel 
{ 
    [Remote("ValidMePlease", "Home", AdditionalFields = "SomeKindOfDate", ErrorMessage = "use date with true")] 
    public bool IsSomething {get;set;} 
    public DateTime? SomeKindOfDate {get;set;} 
} 

Мой контроллер:

[OutputCache(Location = System.Web.UI.OutputCacheLocation.None, NoStore = true)] 
public class HomeController : Controller 
{ 
    public JsonResult ValidMePlease(bool IsSomething , DateTime? SomeKindOfDate) 
    { 
     if (IsSomething && !SomeKindOfDate .HasValue) 
      return Json(false, JsonRequestBehavior.AllowGet); 
     return Json(true, JsonRequestBehavior.AllowGet); 
    } 
} 

Мое мнение:

<div class="control"> 
    @Html.LabelFor(m => m.IsSomething , new { @class = "control-label" }) 
    <div class="controls"> 
     <label class="radio inline"> 
      @Html.RadioButtonFor(m => m.IsSomething , false) No 
     </label> 
     <label class="radio inline"> 
      @Html.RadioButtonFor(m => m.IsSomething, true) Yes 
     </label> 
    </div> 
</div> 

Мой визуализации вид:

<div class="control"> 
     <label class="control-label" for="IsSomething ">Is something</label> 
     <div class="controls"> 
      <label class="radio inline"> 
       <input checked="checked" data-val="true" data-val-remote="use date with true" data-val-remote-additionalfields="*.IsSomething ,*.SomeKindOfDate" data-val-remote-url="/admin/User/ValidMePlease" data-val-required="Is something is required." id="IsSomething " name="IsSomething " type="radio" value="False" /> No 
      </label> 
      <label class="radio inline"> 
       <input id="IsSomething " name="IsSomething " type="radio" value="True" /> Yes 
      </label> 
     </div> 
</div> 

Идея в том, что когда логическое поле истинно, мне нужно потребовать свидание. И в чем проблема. Когда я отправить форму его всегда проходят false для IsSomething в моем ValidMePlease удаленного метода. Я думаю, это происходит потому, что только первый вход имеет data-val- атрибутов. Любое предложение будет оценено по достоинству.

ответ

4

Похоже, есть ошибка в jquery.validate.unobtrusive.js в «удаленной» валидаторе. Попробуйте, может заменить эту строку:

return $(options.form).find(":input[name='" + escapeAttributeValue(paramName) + "']").val(); 

с:

var $input = $(options.form).find(":input[name='" + escapeAttributeValue(paramName) + "']"); 
if ($input.is(":radio")) { 
    return $input.filter(":checked").val(); 
} else { 
    return $input.val(); 
} 

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

Еще одна небольшая вещь - убедиться, что идентификатор уникален в вашем html. В вашем примере у вас есть оба переключателя с одинаковым атрибутом id. Я хотел бы использовать что-то вроде этого:

@Html.RadioButtonFor(m => m.IsSomething, false, new { id = "IsSomething_False" }) 
@Html.RadioButtonFor(m => m.IsSomething, true, new { id = "IsSomething_True" }) 

Добавлено: Проверка должна работать без изменения атрибута ID.

ID по своему определению должен быть уникальным в любой системе, поэтому, убедившись, что он уникален, поможет вам не только при проверке на w3c.org, но и при добавлении меток к каждому переключателю.

+0

Спасибо, помогло мне много. Я использую один и тот же идентификатор для нескольких переключателей, но все еще отлично работает. – Julian

+0

Я рад, что это помогло @ Джулиану. Вы правы, уникальный идентификатор является необязательным шагом для этого вопроса, и проверка на стороне клиента будет работать как ожидалось независимо. Я обновил свой ответ, чтобы объяснить, почему идентификатор должен быть изменен. –

+0

@mardok - Если ответ работает на вас, то, пожалуйста, примите его. –

Смежные вопросы