NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: ASP.NET MVC Client Side validation, Ajax, PartialView

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Majkel
Člen
Avatar
Majkel:5.11.2016 11:40

Ahoj, mám MVC aplikaci, kde načítám do View PartialView tímto způsobem:

<h2>Administration</h2>
@Ajax.ActionLink("Users", "Users", new AjaxOptions { UpdateTargetId = "result" })
@Ajax.ActionLink("Licenses", "Licenses", new AjaxOptions { UpdateTargetId = "result" })
<div id="users-administration"></div>


<div id="result"></div>

PartialView User vypadá takto:

@model LicenseWatcher_MVC.ViewModels.Administration.UsersViewModel

<form role="form" id="frmAddUser">
    @*@Html.ValidationSummary()*@
    @Html.AntiForgeryToken()
    <div class="form-group">
        @Html.LabelFor(m => m.Name)
        @Html.TextBoxFor(m => m.Name, new { @class = "form-control", @data_bind = "value: Name" })
        @Html.ValidationMessageFor(m => m.Name)
        @Html.LabelFor(m => m.Surname)
        @Html.TextBoxFor(m => m.Surname, new { @class = "form-control", @data_bind = "value: Surname" })
    </div>
    <input type="button" class="btn btn-default" value="Add User" data-bind="click: $root.addUser" />
</form>


<div>
    <table class="table table-bordered table-striped">
        <thead>
            <tr>
                <th>@Html.DisplayNameFor(model => model.Name)</th>
                <th>@Html.DisplayNameFor(model => model.Surname)</th>
                <th>Actions</th>
            </tr>
        </thead>

        <tbody data-bind="template: { name: currentTemplate, foreach: lookupCollection }" id="remoteCollection">
            <tr>
                <td> <span data-bind="text: Usr_Id" /></td>
                <td> <span data-bind="text: Name" /></td>
                <td> <span data-bind="text: Surname" /></td>
            </tr>
        </tbody>
    </table>
</div>

<script type="text/html" id="displayOnlyTemplate">
    <tr>
        <td>
            <span data-bind="text: Name"></span>
        </td>
        <td>
            <span data-bind="text: Surname"></span>
        </td>
        <td>
            <input type="button" class="btn btn-info" value="Edit" data-bind="click: $root.edit" />
            <input type="button" class="btn btn-danger" value="Delete" data-bind="click: $root.remove" />
        </td>
    </tr>
</script>

<script type="text/html" id="updateTemplate">
    <td>
        <input type="text" class="form-control" data-bind="value: Name" id="txtaddress" />
    </td>
    <td>
        <input type="text" class="form-control" data-bind="value: Surname" id="txthost" />
    </td>
    <td>
        <input type="button" class="btn btn-info" value="Save" data-bind="click: $root.save" />
        <input type="button" class="btn btn-info" value="Cancel" data-bind="click: $root.cancel" />
    </td>
</script>
<script src="~/Scripts/ViewModels/Administration/UsersViewModel.js"></script>

Property na Modelu UsersViewModel mají nastavený atribut [Required(Error­Message = "Vyplňte prosím jméno")] ale validace mi nechce fungovat. Když stejný kód umístím přímo do View, tak funguje bez problémů. Ale v PartialView se mi validaci rozchodit nedaří. Díky za rady.

 
Odpovědět
5.11.2016 11:40
Avatar
Odpovídá na Majkel
Michal Štěpánek:5.11.2016 13:29

Neměl by tento řádek

@*@Html.ValidationSummary()*@

vypadat spíš takto?

@Html.ValidationSummary()
Nahoru Odpovědět
5.11.2016 13:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Majkel
Člen
Avatar
Odpovídá na Michal Štěpánek
Majkel:7.11.2016 17:32

Ahoj, @Html.Validati­onSummary() slouží pro souhrný výpis validačních chyb. Pokud chceš zobrazit validaci pouze pro daný textbox, nepotřebuješ to.

Aby fungovala validace na vloženém PartialView je potřeba nejprve:

// Znovu načte validaci pro PartialView
jQuery.validator.unobtrusive.parse();
jQuery.validator.unobtrusive.parse("#frmAddUser");

a následně v ajaxovém volání

// Validace pro PartialView
if (!$("#frmAddUser").valid()) {
    return false;
}

Pak to funguje :-)

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
7.11.2016 17:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.