SORU
24 NİSAN 2011, Pazar


Bağlamak için doğru yolu mvc3 bir button bir model için

Sitenin şart ve koşullar için bunları bir liste içeren bir görünümü var.

örneğin

Yes
@Html.RadioButtonFor(model => model.TermsAndConditions, "True")
No
@Html.RadioButtonFor(model => model.TermsAndConditions, "False",
     new { Checked = "checked" })
</div>
@Html.ValidationStyledMessageFor(model => model.TermsAndConditions)

Hepsi Tamam eğer kullanıcı tamamlar formu olmadan herhangi bir hata ancak eğer ben sunucu taraflı doğrulama ve sayfa yenilenir kaybederim seçimi, kullanıcının yaptığı için list ve seçilen radyo gider için varsayılan değer false alanı.

Nasıl sunucu tarafı doğrulama sonra eğer kullanıcı doğru seçerse bu değer korunur böylece button bağlama olmam gerekiyor?

Herhangi bir öneriniz çok iyi olurdu!

CEVAP
10 Ocak 2012, Salı


Kısa cevap için, üç şey yapmanız gerekir:

  1. İkinci radyo düğmesini new { Checked = "checked" } çıkarın. Kodlanmış bu kontrol değeri bütün sihir geçersiz kılar.
  2. Denetleyicisi eylem senin ViewResult döndüğünüzde, TermsAndConditions yanlış olduğu model kendi sınıfının bir örneğini vereceğim. Bu yanlış bir radyo düğmesi için önceden seçilmiş olması için gereken varsayılan false değerini sağlayacaktır.
  3. Radyo düğmeleri için değerleri yerine "True" "False" true false kullanın. Bu özellik 10 ** türünde olmasıdır. Doğrusu, tesadüfen doğru dize seçti RadioButtonFor yöntemi true false ama değer parametre için beyan tip object. İyi bir dize kendini dönüştürmeden ziyade karşılaştırmak istediğiniz gerçek türü geçmek. Daha fazla bu aşağıda.

Burada derinlik içinde neler var:

Çerçeve sizin için otomatik olarak tüm bu yapmak istiyor, ama sizin istediğiniz davranışı elde etmek için çerçeve ile savaşmak zorunda kılan ilk iki şeyleri yanlış yaptın.

RadioButtonFor yöntemi özelliğinin değeri .ToString() belirtilen aramalar ve radyo düğmesini oluştururken geçirilen değeri .ToString() karşılaştırır. Eğer eşit iseler, o zaman dahili isChecked = true ayarlar ve HTML checked="checked" render biter. Bu onay için hangi karar verir. Sadece özelliğinin değeri için radyo düğmesi değerini karşılaştırır ve eşleşen bir denetler.

Hemen hemen her özelliği radyo düğmeleri bu şekilde işlemek, ve sihirli bir şekilde çalışacaktır. Dizeleri, değer vermez, ve numaralama türleri bile iş! Benzersiz nesnenin değerini temsil eden bir dize döndürür ToString bir yöntem olan herhangi bir nesne çalışacaktır. Sadece ayarları özellik aslında olabilecek bir değer radyo düğmesi değerini olduğundan emin olmak için var. Bunu yapmak için en kolay yolu sadece değerini kendisi, değeri dize gösterimini değil geçmek. Çerçeve sizin için bir dize dönüştürmek izin.

(Beri oldu geçişte doğru dize temsilleri true false, daha sonra bu değerler çalışacak tamir ettirdiğin sürece senin iki gerçek hata, ama yine de akıllıca pas içinde gerçek değerleri değil, kendi dizeleri.)

İlk gerçek hata sabit kodlama olduğu için Checked = "checked" "Hayır" radyo düğmesini. Bu çerçeve sizin için yapmaya çalıştığı şey geçersiz kılar ve bu radyo düğmesi her zaman kontrol sonuçlanır.

İstediğiniz belli ki "Hayır" radyo düğmesini önceden seçilmiş olmak, ama bunu yapmak için her şeyi ile uyumlu yukarıda bir şekilde. TermsAndConditions false, "radyo düğmeleri." sarayım şekilde ayarlandığı görünüm modeli kendi sınıfının bir örneğini vermen gerekiyor Normalde, ilk tepki veren denetleyici bir eylem bir URL isteği Görünüm model sınıfının bir örneğini hiç vermez. Genellikle, sadece 22**. Varsayılan değer seçili istiyorsanız bu yana, ancak, TermsAndConditions yanlış ayarlanmış modelinin bir örneği ile görünüm sağlamalısınız.

Burada bazı kaynak kodu tüm bunları gösteren:

Muhtemelen bu Hesap sınıfı bir tür. (Görüşün modeli):

public class Account
{
    public bool TermsAndConditions { get; set; }
    //other properties here.
}

Bazı denetleyici yöntemleri:

//This handles the initial GET request.
public ActionResult CreateAccount()
{
    //this default instance will be used to pre-populate the form, making the "No" radio button checked.
    var account = new Account
    {
        TermsAndConditions = false
    };

    return View( account );
}

//This handles the POST request.
[HttpPost]
public ActionResult CreateAccount( Account account )
{
    if ( account.TermsAndConditions )
    {
        //TODO: Other validation, and create the account.
        return RedirectToAction( "Welcome" );
    }
    else
    {
        ModelState.AddModelError( "TermsAndConditionsAgreement", "You must agree to the Terms and Conditions." );
        return View( account );
    }           
}

//Something to redirect to.
public ActionResult Welcome()
{
    return View();
}

Tüm Görünüm:

@model Account
@{
    ViewBag.Title = "Create Account";
}
@using ( Html.BeginForm() )
{
    <div>
        <span>Do you agree to the Terms and Conditions?</span>
        <br />
        @Html.RadioButtonFor( model => model.TermsAndConditions, true, new { id = "TermsAndConditions_true" } )
        <label for="TermsAndConditions_true">Yes</label>
        <br />
        @Html.RadioButtonFor( model => model.TermsAndConditions, false, new { id = "TermsAndConditions_false" } )
        <label for="TermsAndConditions_false">No</label>
        <br />
        @Html.ValidationMessage( "TermsAndConditionsAgreement" )
    </div>
    <div>
        <input id="CreateAccount" type="submit" name="submit" value="Create Account" />
    </div>
}

BONUS:Radyo düğmeleri için fazladan bir özellik ekledim fark edeceksiniz. Sadece radyo düğmesi etiket için düz metin kullanmak yerine, her bir radyo düğmesinin Kimlikleri için for öznitelik kümesi ile label HTML öğesi kullandım. Bu kullanıcılar ilgili radyo düğmesini tıklayın kendisi yerine radyo düğmesini seçmek için etiketin üzerine tıklayın sağlar. Bu standart HTML. Bu ikisi de aynı KİMLİĞİ alacaklar. aksi halde radyo düğmeleri manuel Kimlikleri ayarlamak için sadece vardı çalışmak için "işe yaramaz.", TermsAndConditions

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hydejiaqi

    hydejiaqi

    12 Mart 2008
  • ravinderosahn

    ravinderosah

    20 Temmuz 2009
  • TheDailyTechDose

    TheDailyTech

    15 EKİM 2012