MaskedTextBoxFor теряет значение после отправки представления MVC Razor

После отправки формы в контроллер входы MaskedTextBoxFor теряют свои значения, если представление возвращается из контроллера, в то время как все другие значения (textboxdor, dropdownlistfor) остаются в том виде, в котором они были отправлены. Итак, как сделать так, чтобы значения MaskedTextBoxFor оставались, когда отправленное представление возвращается из контроллера? Заранее спасибо...

Просмотр (обновление):

@model EurodeskMultipliers.Domain.Entities.Multiplier


@using (Html.BeginForm("Create", "Multiplier", FormMethod.Post,
new { id = "createForm", enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()

    <div class="container">

        <fieldset>
            <section>
                <div class="legend-left">                        

                    @Html.LabelFor(m => m.Phone)
                    @(Html.Kendo().MaskedTextBoxFor(m => m.Phone).Mask("(0999) 000 00 00"))
                    @Html.ValidationMessageFor(m => m.Phone)
                    <br />                       

                    @Html.LabelFor(m => m.ContactPhone)
                    @(Html.Kendo().MaskedTextBoxFor(m => m.ContactPhone).Mask("(0999) 000 00 00"))
                    <br />

                    @Html.LabelFor(m => m.ContactMobile)
                    @(Html.Kendo().MaskedTextBoxFor(m => m.ContactMobile).Mask("(0999) 000 00 00"))
                    @Html.ValidationMessageFor(m => m.ContactMobile)
                    <br />
                </div>
            </section>
        </fieldset>

        <div class="dv-right">
            @(Html.Kendo().Button()
                .Name("submitbtn")
                .Content("Save")
            )                
        </div>
    </div>
}


контроллер:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Exclude = null)] Multiplier multiplier)
{
    try
    {
        if (ModelState.IsValid)
        {
            return View(); //FOR TESTING "MaskedTextBox"

            db.Multipliers.Add(multiplier);
            db.SaveChanges();
            return RedirectToAction("Completed");
        }
    }
    catch (RetryLimitExceededException /* dex */)
        {
        //Log the error (uncomment dex variable name and add a line here to write a log.)
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
    }

    return View(multiplier);
}


Модель:

public class Multiplier
{
    public int ID { get; set; }

    [Required(ErrorMessage = "Required")]
    [RegularExpression(@"\([0-9]{4}\) [0-9]{3} [0-9]{2} [0-9]{2}", ErrorMessage = "Check phone number.")] 
    [MaxLength(20)]
    [Display(Name = "Phone")]
    public string Phone { get; set; }

    [Required(ErrorMessage = "Required")]
    [RegularExpression(@"\([0-9]{4}\) [0-9]{3} [0-9]{2} [0-9]{2}", ErrorMessage = "Check phone number.")] 
    [MaxLength(20)]
    [Display(Name = "Mobile Phone")]
    public string ContactMobile { get; set; } 

    //Navigation property       
    public virtual InstituteStatus InstituteStatus { get; set; }

    [ForeignKey("TermID")]
    public virtual Lookup Lookup { get; set; }

    //Collection navigation property
    public virtual ICollection<Participant> Participants { get; set; }

    //For using two Foreign Key on the same (Multiplier) table 
    [ForeignKey("MultiplierCityID")]
    [InverseProperty("MultiplierCityMultipliers")]
    public virtual City MultiplierCity { get; set; }

    [ForeignKey("ContactCityID")]
    [InverseProperty("ContactCityMultipliers")]
    public virtual City ContactCity { get; set; }
}

5 ответов

Решение

Наконец, я вижу, что использование @Html.TextBoxFor() с опцией класса "k-textbox" решило проблему, и может возникнуть проблема, связанная с Html.Kendo().MaskedTextBox(). Поскольку все то же самое, за исключением этого и так, для тех, кто может столкнуться с проблемой, я разместил последний статус поля ниже. С другой стороны, большое спасибо @jumpingcode, OnaBai и @mmillican за их любезную помощь. Я проголосовал за их ответы.

@Html.LabelFor(m => m.Phone)
@Html.TextBoxFor(m => m.Phone, new { maxlength = 13, @class = "k-textbox", placeholder = "+49xxxxxxxxxx" })
@Html.ValidationMessageFor(m => m.Phone)

Если вы посмотрите на ASP.NET MVC пример по телерику тут. Вы увидите, что вы используете MaskedTextBoxFor скорее, чем MaskedTextBox, Вот пример кода с сайта:

@(Html.Kendo().MaskedTextBox()
    .Name("phone_number")
    .Mask("(999) 000-0000")
    .Value("555 123 4567")
)

Здесь вы хотите заменить .Name("phone_number") с .Name("Phone")

У меня была та же проблема с одной из моих форм. Похоже, что расширение бритвы MaskedTextBoxFor не смотрит на значения в ModelState. Таким образом, если проверка не пройдена и форма перезагружается, часть формы будет заполнена заново, а номера телефонов - нет.

Поэтому я просто использовал обычный @Html.TextBoxFor, но добавил маску кендо вручную через javascript, и она работала нормально.

У меня была такая же проблема с MaskTextBox, но, к счастью для меня, я столкнулся с подобной проблемой с не связанной проблемой. Мой maskedtextbox был для поля Phone Number, которое я поместил в шаблон редактора.

@model string
@(Html.Kendo()
    .MaskedTextBox()
    .Name(Html.IdForModel().ToString())
    .Mask("000-000-0000")            
    .Deferred())

В предыдущей проблеме я решил ее, посмотрев в состояние модели для модели и выяснив, имеет ли она значение попытки (из-за неудачной проверки). Затем, если это так, я устанавливаю значение параметра MaskedTextBox. Обновленный шаблон редактора приведен ниже.

@model string
@{ 
    string attemptedValue = "";
    ModelState modelStateForValue = Html.ViewData.ModelState[Html.IdForModel().ToString()];
    if (modelStateForValue != null)
    {
        attemptedValue = modelStateForValue.Value.AttemptedValue;
    }
}
@(Html.Kendo()
    .MaskedTextBox()
    .Name(Html.IdForModel().ToString())
    .Mask("000-000-0000")    
    .Value((!string.IsNullOrEmpty(attemptedValue)) ? attemptedValue : "")
    .Deferred())

Надеюсь это поможет.

В вашем фрагменте кода контроллера в исходном вопросе у вас есть следующая строка:

return View(); //FOR TESTING "MaskedTextBox"

Значение не привязано к MultiSelectFor() потому что вы не передаете модель обратно в представление. Если вы измените его на следующее, оно должно работать:

return View(multiplier);