मैं ASP.NET कोर MVC में शुरुआत कर रहा हूँ। मुझे अपने वेबसाइट कोड में एक समस्या है।

मेरा मॉडल User है जिसमें कुछ फ़ील्ड हैं, और मैंने इन क्षेत्रों के आधार पर एक दृश्य मॉडल लिखा है।

मैंने निम्नलिखित कोड लिखा है:

मेरा दृश्य मॉडल: RegisterViewModel:

public class RegisterViewModel
{
    [Display(Name = "Username")]
    [Required(ErrorMessage = "Enter {0} value please.")]
    [MaxLength(20, ErrorMessage = "{0} Shouldn't have more than {1} Characters")]
    public string Username { get; set; }
    
    [Display(Name = "Password")]
    [Required(ErrorMessage = "Enter {0} value please.")]
    [MaxLength(50, ErrorMessage = "{0} Shouldn't have more than {1} Characters")]
    public string Password { get; set; } 
}

मेरा नियंत्रक: AccountController:

public class AccountController : Controller
{
    private IUser _iuser;

    public AccountController(IUser iuser)
    {
        _iuser = iuser;
    }

    public IActionResult Register()
    {
        return View();
    }

    [HttpPost]
    public IActionResult Register(RegisterViewModel register)
    {
        if (ModelState.IsValid)
        {
            if (_iuser.isUsernameExist(register.Username))
            {
                ModelState.AddModelError("UserName", "This User Exists!");
                return PartialView(register);
            }
            else
            {
                User user = new User()
                {
                    Username = register.Username,
                    Password = HashGenerators.EncodingPassWithMD5(register.Password),
                    RoleId = 2,
                };

                _iuser.AddUser(user);
                string TabName = "UserTab";
                return Json(new { redirectToUrl = Url.Action("Index", "Profile", new {TabName}) });
            }
        }
        else
        {
            return PartialView(register);
        }
    }
}

रजिस्टर कार्रवाई में एक दृश्य है जो एक मोडल के रूप में प्रदर्शित हुआ है।

देखें Register.cshtml:

<div class="row">
<div class="col-md-8 col-md-offset-2">
    <hr />
    <form asp-action="Register">
        <div asp-validation-summary="ModelOnly" class="text-danger text-right"></div>          
        <div class="form-group">
            <input asp-for="Username" class="form-control" , placeholder="username" id="txtUsername"/>
            <span asp-validation-for="Username" class="text-danger" id="ValidationSummery"></span>
        </div>
        <div class="form-group">
            <input asp-for="Password" class="form-control" , placeholder="password" id="txtPassword"/>
            <span asp-validation-for="Password" class="text-danger text-right" id="ValidationSummery"></span>
        </div>
        <div class="form-group">
            <input type="button" value="Create" onclick='AddUser()' class="btn-red pull-left" />
            <button href="#" type="button" onclick='ClearForm()' class="btn-red pull-right"> Clear Form </button>
        </div>
    </form>
</div>
</div>

मोडल कोड (उपरोक्त कोड के अंत में):

<div id="myModal" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
    <div class="modal-content">
        <div id="bodyModal" class="modal-body">
        </div>
    </div>
</div>
</div>

और देखने के अंत में, मेरे पास ये अजाक्स स्क्रिप्ट हैं:

<script>
function ClearForm() {
    $.ajax({
        url: "/Account/Register/",
        type: "Get",
        data: {}
    }).done(function (result) {
        $('#myModal').modal('show');
        $('#bodyModal').html(result);
    });
    $('#myModal').modal('dispose'); }
</script>
<script>
function AddUser() {
$.ajax({
    url: "/Account/Register/",
    type: "Post",
    data: {
        Username: $("#txtUsername").val(),
        Password: $("#txtPassword").val(),
    },
    success: function (response) {
        window.location.href = response.redirectToUrl;
    }
}).done(function (result) {
    $('#myModal').modal('show');
    $('#bodyModal').html(result);
});}
</script>

जब प्रोग्राम चल रहा हो, ClearForm बटन अच्छी तरह से काम करता है, Create बटन अच्छी तरह से काम करता है जब मॉडलस्टेट मान्य होता है। लेकिन जब मॉडलस्टेट मान्य नहीं होता है, तो यह एक त्रुटि पृष्ठ पर जाता है (हैलो वर्ल्ड!), मुझे 1 सेकंड के लिए सत्यापन त्रुटियां दिखाई देती हैं लेकिन ब्राउज़र एक गलत पृष्ठ खोलता है और सत्यापन त्रुटि दिखाने के लिए मोडल पर नहीं रहता है।

नोट: जब मैं हटाता हूं: ( window.location.href = response.redirectToUrl;) AJAX AddUser फ़ंक्शन से सफलता भाग पर, मोडल खुला रहता है और सत्यापन त्रुटियां प्रदर्शित होती हैं। लेकिन अगर मॉडलस्टेट मान्य है, तो मोडल खुला रहता है लेकिन यह खाली था और गंतव्य पृष्ठ (इंडेक्स/प्रोफाइल # यूजरटैब) प्रदर्शित नहीं होता है।

कृपया मेरी मदद करें, मैं इस समस्या को हल करने के लिए उपरोक्त कोड कैसे बदल सकता हूं?

0
NedaM 11 नवम्बर 2020, 09:19

2 जवाब

सबसे बढ़िया उत्तर

https://stackoverflow.com/users/11965297/mj1313 की प्रेरक सहायता से, मैंने अपना कोड निम्नलिखित की तरह बदल दिया और मेरे पूरी तरह से हल हो गई है समस्या...

नियंत्रक में, मैं मॉडलस्टेट वैधता स्थिति निर्दिष्ट करने के लिए, मेरे विचार में व्यूबैग द्वारा पैरामीटर (मान्य) भेजता हूं।

[HttpPost]
public IActionResult Register(RegisterViewModel register)
{
    if (ModelState.IsValid)
    {
        if (_iuser.isUsernameExist(register.Username))
        {
            ViewBag.Valid= "1"; // It's part of my change
            ModelState.AddModelError("UserName", "This User Exists!");
            return PartialView(register);
        }
        else
        {
            User user = new User()
            {
                Username = register.Username,
                Password = HashGenerators.EncodingPassWithMD5(register.Password),
                RoleId = 2,
            };

            _iuser.AddUser(user);
            ViewBag.Valid= "0"; // It's part of my change
            string TabName = "UserTab";
            return Json(new { redirectToUrl = Url.Action("Index", "Profile", new {TabName}) });
        }
    }
    else
    {
        ViewBag.Valid= "1"; // It's part of my change
        return PartialView(register);
    }
}

और मेरे विचार में, मैं व्यूबैग को बचाने के लिए एक छिपे हुए इनपुट का उपयोग करता हूं।

<form asp-action="Register">

    <input name="IsValid" type="hidden" value="@ViewBag.Valid" /> @*It's part of my change*@
    
    <div asp-validation-summary="ModelOnly" class="text-danger text-right"></div>          
    <div class="form-group">
        <input asp-for="Username" class="form-control" , placeholder="username" 
    </div>
     .....
</form>

अंत में, मैं अजाक्स फ़ंक्शन, सफलता भाग बदलता हूं:

function AddUser() {
   $.ajax({
       url: "/Account/Register/",
       type: "Post",
       data: {
            Username: $("#txtUsername").val(),
            Password: $("#txtPassword").val(),
       },
       success: function (response) {
            $('#bodyModal').html(response);
            var isValid = $('body').find('[name="IsValid"]').val();
            if (isValid) {
                 $('#myModal').modal('show');
             } else {
                 window.location.href = response.redirectToUrl;
             }           
       }
 }).done(function (result) {
      $('#myModal').modal('show');
      $('#bodyModal').html(result);
 });}
0
NedaM 12 नवम्बर 2020, 09:32

मुझे लगता है कि सत्यापन संदेश दिखाने के लिए आपके पास एक नया आंशिक दृश्य हो सकता है।

आंशिक दृश्य में छुपा इनपुट फ़ील्ड जोड़ें:

<input name="IsValid" type="hidden" value="@ViewData.ModelState.IsValid.ToString()" />

फिर अजाक्स सफलता समारोह में यह निर्धारित करें कि IsValid के मान को देखते हुए मोडल दिखाना है या रीडायरेक्ट करना है या नहीं

आपके कोड के आधार पर एक साधारण डेमो।

Register.cshtml:

@model RegisterViewModel
@{
    ViewData["Title"] = "Register";
}

<h1>Register</h1>

<div class="row">
    <div class="col-md-8 col-md-offset-2">
        <hr />
        <form asp-action="Register">
            <div asp-validation-summary="ModelOnly" class="text-danger text-right"></div>
            <div class="form-group">
                <input asp-for="Username" class="form-control" , placeholder="username" id="txtUsername" />
                <span asp-validation-for="Username" class="text-danger" id="ValidationSummery"></span>
            </div>
            <div class="form-group">
                <input asp-for="Password" class="form-control" , placeholder="password" id="txtPassword" />
                <span asp-validation-for="Password" class="text-danger text-right" id="ValidationSummery"></span>
            </div>
            <div class="form-group">
                <input type="button" value="Create" onclick='AddUser()' class="btn-red pull-left" />
                <button href="#" type="button" onclick='ClearForm()' class="btn-red pull-right"> Clear Form </button>
            </div>
        </form>
    </div>
</div>

<div id="myModal" class="modal fade" tabindex="-1" role="dialog">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div id="bodyModal" class="modal-body">
            
            </div>
        </div>
    </div>
</div>

@section scripts{

    <script>
        function AddUser() {
            $.ajax({
                url: "/Account/Register/",
                type: "Post",
                data: {
                    Username: $("#txtUsername").val(),
                    Password: $("#txtPassword").val(),
                },
                success: function (response) {
                    $('#bodyModal').html(response);
                    var isValid = $('body').find('[name="IsValid"]').val() == 'True';
                    if (!isValid) {
                        $('#myModal').modal('show');
                    } else {
                        window.location.href = "@Url.Action("Index", "Profile")";
                    }
                
                }
            });
        }
    </script>
}

_Register.cshtml(आंशिक दृश्य):

@model RegisterViewModel

<form asp-action="Register">
    <input name="IsValid" type="hidden" value="@ViewData.ModelState.IsValid.ToString()" />
    <div asp-validation-summary="ModelOnly" class="text-danger text-right"></div>
    <div class="form-group">
        <input asp-for="Username" class="form-control" , placeholder="username" id="txtUsername" readonly />
        <span asp-validation-for="Username" class="text-danger" id="ValidationSummery"></span>
    </div>
    <div class="form-group">
        <input asp-for="Password" class="form-control" , placeholder="password" id="txtPassword" readonly />
        <span asp-validation-for="Password" class="text-danger text-right" id="ValidationSummery"></span>
    </div>
</form>

नियंत्रक:

public class AccountController : Controller
{
    public IActionResult Register()
    {
        
        return View();
    }

    [HttpPost]
    public IActionResult Register(RegisterViewModel register)
    {
        if (ModelState.IsValid)
        {
            // do some stuff
        }

        return PartialView("_Register",register);
        
    }
}

परिणाम:

enter image description here

1
mj1313 11 नवम्बर 2020, 10:50