50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

model binding در ASP.net MVC

سلام.

سناریوی ساده زیر را در نظر بگیرید:

فرمی به صورت زیر داریم که بر روی آن سه عدد تکست باکس قرار داده شده است.

سلام.
سناریوی ساده زیر را در نظر بگیرید:
فرمی به صورت زیر داریم که بر روی آن سه عدد تکست باکس قرار داده شده است.
||http://tosinso.com/files/get/c5657833-b866-42fe-b12f-96996d4e2cd3||
کاربر بعد از پر کردن تکست باکس ها، دکمه Submit را فشار میدهد. بعد از submit کردن فرم، به مقدار Person Id یک واحد اضافه شده و به مقادیر First Name و Last Name واژه ی approved چسبانده شده و سپس به همین فرم بر میگردیم و مقادیر جدید درون تکست باکس های مربوطه قرار داده می شوند.

برای این کار درون پوشه Models یک کلاس به نام Person ایجاد کرده ام.
<c#>
public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
<c#>
همچنین یک controller به نام  HomeController ایجاد کرده ام و درون آن دو action method به صورت زیر قرار داده ام:
<c#>
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult CreatePerson()
    {
        return View(new Person());
    }

    [HttpPost]
    public ActionResult CreatePerson(Person person)
    {
        person.PersonId += 1;
        person.FirstName += - approved;
        person.LastName += - approved;
        return View(person);
    }
}
<c#>

درون پوشه Views نیز یک view به نام CreatePerson به صورت زیر ایجاد کرده ام:
<htm>
@model HelperMethods.Models.Person
@{
    ViewBag.Title = CreatePerson;
    Layout = ~/Views/Shared/_Layout.cshtml;
}

<h2>CreatePerson</h2>

@using (Html.BeginForm(CreatePerson, Home))
{
    <div class=dataElem>
        @Html.TextBoxFor(m => m.PersonId)
    </div>

    <div class=dataElem>
        <label>First Name:</label>
        @Html.TextBoxFor(m => m.FirstName)
    </div>

    <div class=dataElem>
        <label>Last Name:</label>
        @Html.TextBoxFor(m => m.LastName)
    </div>

    <input type=submit name=btnSubmit value=Submit />
}
<htm>
اما وقتی برنامه را اجرا کرده و فیلدها را پر می کنم، بعد از سابمیت کردن فرم مشاهده می شود که مقادیر قبلی همچنان درون درون تکست باکس ها بدون تغییر قرار گرفته اند (عکس زیر)
||http://tosinso.com/files/get/0b82a9d3-8acc-455a-8838-65713f47aac6||
جالب اینجاست که اگر به جای استفاده از helper methodها، در view از تگ های HTML به صورت زیر استفاده کنم، به نتیجه مورد نظرم میرسم. (تصویر آخر)
<htm>
@model HelperMethods.Models.Person
@{
    ViewBag.Title = CreatePerson;
    Layout = ~/Views/Shared/_Layout.cshtml;
}

<h2>CreatePerson</h2>

@using (Html.BeginForm(CreatePerson, Home))
{
    <div class=dataElem>
        <label>Person Id:</label>
        <input type=text name=PersonId value=@Model.PersonId />
    </div>

    <div class=dataElem>
        <label>First Name:</label>
        <input type=text name=FirstName value=@Model.FirstName />
    </div>

    <div class=dataElem>
        <label>Last Name:</label>
        <input type=text name=LastName value=@Model.LastName />
    </div>

    <input type=submit name=btnSubmit value=Submit />
}
<htm>
||http://tosinso.com/files/get/92665940-764e-4c77-9a55-a42f17f88d69||
به نظر شما علت این رخداد در چیست؟

کاربر بعد از پر کردن تکست باکس ها، دکمه Submit را فشار میدهد. بعد از submit کردن فرم، به مقدار Person Id یک واحد اضافه شده و به مقادیر First Name و Last Name واژه ی approved چسبانده شده و سپس به همین فرم بر میگردیم و مقادیر جدید درون تکست باکس های مربوطه قرار داده می شوند.

برای این کار درون پوشه Models یک کلاس به نام Person ایجاد کرده ام.

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

همچنین یک controller به نام HomeController ایجاد کرده ام و درون آن دو action method به صورت زیر قرار داده ام:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult CreatePerson()
    {
        return View(new Person());
    }

    [HttpPost]
    public ActionResult CreatePerson(Person person)
    {
        person.PersonId += 1;
        person.FirstName += "- approved";
        person.LastName += "- approved";
        return View(person);
    }
}

درون پوشه Views نیز یک view به نام CreatePerson به صورت زیر ایجاد کرده ام:

@model HelperMethods.Models.Person
@{
    ViewBag.Title = "CreatePerson";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>CreatePerson</h2>

@using (Html.BeginForm("CreatePerson", "Home"))
{
    <div class="dataElem">
        @Html.TextBoxFor(m => m.PersonId)
    </div>

    <div class="dataElem">
        <label>First Name:</label>
        @Html.TextBoxFor(m => m.FirstName)
    </div>

    <div class="dataElem">
        <label>Last Name:</label>
        @Html.TextBoxFor(m => m.LastName)
    </div>

    <input type="submit" name="btnSubmit" value="Submit" />
}

اما وقتی برنامه را اجرا کرده و فیلدها را پر می کنم، بعد از سابمیت کردن فرم مشاهده می شود که مقادیر قبلی همچنان درون درون تکست باکس ها بدون تغییر قرار گرفته اند (عکس زیر)

سلام.
سناریوی ساده زیر را در نظر بگیرید:
فرمی به صورت زیر داریم که بر روی آن سه عدد تکست باکس قرار داده شده است.
||http://tosinso.com/files/get/c5657833-b866-42fe-b12f-96996d4e2cd3||
کاربر بعد از پر کردن تکست باکس ها، دکمه Submit را فشار میدهد. بعد از submit کردن فرم، به مقدار Person Id یک واحد اضافه شده و به مقادیر First Name و Last Name واژه ی approved چسبانده شده و سپس به همین فرم بر میگردیم و مقادیر جدید درون تکست باکس های مربوطه قرار داده می شوند.

برای این کار درون پوشه Models یک کلاس به نام Person ایجاد کرده ام.
<c#>
public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
<c#>
همچنین یک controller به نام  HomeController ایجاد کرده ام و درون آن دو action method به صورت زیر قرار داده ام:
<c#>
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult CreatePerson()
    {
        return View(new Person());
    }

    [HttpPost]
    public ActionResult CreatePerson(Person person)
    {
        person.PersonId += 1;
        person.FirstName += - approved;
        person.LastName += - approved;
        return View(person);
    }
}
<c#>

درون پوشه Views نیز یک view به نام CreatePerson به صورت زیر ایجاد کرده ام:
<htm>
@model HelperMethods.Models.Person
@{
    ViewBag.Title = CreatePerson;
    Layout = ~/Views/Shared/_Layout.cshtml;
}

<h2>CreatePerson</h2>

@using (Html.BeginForm(CreatePerson, Home))
{
    <div class=dataElem>
        @Html.TextBoxFor(m => m.PersonId)
    </div>

    <div class=dataElem>
        <label>First Name:</label>
        @Html.TextBoxFor(m => m.FirstName)
    </div>

    <div class=dataElem>
        <label>Last Name:</label>
        @Html.TextBoxFor(m => m.LastName)
    </div>

    <input type=submit name=btnSubmit value=Submit />
}
<htm>
اما وقتی برنامه را اجرا کرده و فیلدها را پر می کنم، بعد از سابمیت کردن فرم مشاهده می شود که مقادیر قبلی همچنان درون درون تکست باکس ها بدون تغییر قرار گرفته اند (عکس زیر)
||http://tosinso.com/files/get/0b82a9d3-8acc-455a-8838-65713f47aac6||
جالب اینجاست که اگر به جای استفاده از helper methodها، در view از تگ های HTML به صورت زیر استفاده کنم، به نتیجه مورد نظرم میرسم. (تصویر آخر)
<htm>
@model HelperMethods.Models.Person
@{
    ViewBag.Title = CreatePerson;
    Layout = ~/Views/Shared/_Layout.cshtml;
}

<h2>CreatePerson</h2>

@using (Html.BeginForm(CreatePerson, Home))
{
    <div class=dataElem>
        <label>Person Id:</label>
        <input type=text name=PersonId value=@Model.PersonId />
    </div>

    <div class=dataElem>
        <label>First Name:</label>
        <input type=text name=FirstName value=@Model.FirstName />
    </div>

    <div class=dataElem>
        <label>Last Name:</label>
        <input type=text name=LastName value=@Model.LastName />
    </div>

    <input type=submit name=btnSubmit value=Submit />
}
<htm>
||http://tosinso.com/files/get/92665940-764e-4c77-9a55-a42f17f88d69||
به نظر شما علت این رخداد در چیست؟

جالب اینجاست که اگر به جای استفاده از helper methodها، در view از تگ های HTML به صورت زیر استفاده کنم، به نتیجه مورد نظرم میرسم. (تصویر آخر)

@model HelperMethods.Models.Person
@{
    ViewBag.Title = "CreatePerson";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>CreatePerson</h2>

@using (Html.BeginForm("CreatePerson", "Home"))
{
    <div class="dataElem">
        <label>Person Id:</label>
        <input type="text" name="PersonId" value="@Model.PersonId" />
    </div>

    <div class="dataElem">
        <label>First Name:</label>
        <input type="text" name="FirstName" value="@Model.FirstName" />
    </div>

    <div class="dataElem">
        <label>Last Name:</label>
        <input type="text" name="LastName" value="@Model.LastName" />
    </div>

    <input type="submit" name="btnSubmit" value="Submit" />
}

سلام.
سناریوی ساده زیر را در نظر بگیرید:
فرمی به صورت زیر داریم که بر روی آن سه عدد تکست باکس قرار داده شده است.
||http://tosinso.com/files/get/c5657833-b866-42fe-b12f-96996d4e2cd3||
کاربر بعد از پر کردن تکست باکس ها، دکمه Submit را فشار میدهد. بعد از submit کردن فرم، به مقدار Person Id یک واحد اضافه شده و به مقادیر First Name و Last Name واژه ی approved چسبانده شده و سپس به همین فرم بر میگردیم و مقادیر جدید درون تکست باکس های مربوطه قرار داده می شوند.

برای این کار درون پوشه Models یک کلاس به نام Person ایجاد کرده ام.
<c#>
public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
<c#>
همچنین یک controller به نام  HomeController ایجاد کرده ام و درون آن دو action method به صورت زیر قرار داده ام:
<c#>
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult CreatePerson()
    {
        return View(new Person());
    }

    [HttpPost]
    public ActionResult CreatePerson(Person person)
    {
        person.PersonId += 1;
        person.FirstName += - approved;
        person.LastName += - approved;
        return View(person);
    }
}
<c#>

درون پوشه Views نیز یک view به نام CreatePerson به صورت زیر ایجاد کرده ام:
<htm>
@model HelperMethods.Models.Person
@{
    ViewBag.Title = CreatePerson;
    Layout = ~/Views/Shared/_Layout.cshtml;
}

<h2>CreatePerson</h2>

@using (Html.BeginForm(CreatePerson, Home))
{
    <div class=dataElem>
        @Html.TextBoxFor(m => m.PersonId)
    </div>

    <div class=dataElem>
        <label>First Name:</label>
        @Html.TextBoxFor(m => m.FirstName)
    </div>

    <div class=dataElem>
        <label>Last Name:</label>
        @Html.TextBoxFor(m => m.LastName)
    </div>

    <input type=submit name=btnSubmit value=Submit />
}
<htm>
اما وقتی برنامه را اجرا کرده و فیلدها را پر می کنم، بعد از سابمیت کردن فرم مشاهده می شود که مقادیر قبلی همچنان درون درون تکست باکس ها بدون تغییر قرار گرفته اند (عکس زیر)
||http://tosinso.com/files/get/0b82a9d3-8acc-455a-8838-65713f47aac6||
جالب اینجاست که اگر به جای استفاده از helper methodها، در view از تگ های HTML به صورت زیر استفاده کنم، به نتیجه مورد نظرم میرسم. (تصویر آخر)
<htm>
@model HelperMethods.Models.Person
@{
    ViewBag.Title = CreatePerson;
    Layout = ~/Views/Shared/_Layout.cshtml;
}

<h2>CreatePerson</h2>

@using (Html.BeginForm(CreatePerson, Home))
{
    <div class=dataElem>
        <label>Person Id:</label>
        <input type=text name=PersonId value=@Model.PersonId />
    </div>

    <div class=dataElem>
        <label>First Name:</label>
        <input type=text name=FirstName value=@Model.FirstName />
    </div>

    <div class=dataElem>
        <label>Last Name:</label>
        <input type=text name=LastName value=@Model.LastName />
    </div>

    <input type=submit name=btnSubmit value=Submit />
}
<htm>
||http://tosinso.com/files/get/92665940-764e-4c77-9a55-a42f17f88d69||
به نظر شما علت این رخداد در چیست؟

به نظر شما علت این رخداد در چیست؟

پرسیده شده در 1395/05/04 توسط

1 پاسخ

1

سلام رامین جان، برای حل این مشکل شما تو Action ای که کار Post رو انجام میده باید TempData رو مقدار دهی کنی و بعد Redirect کنی به اکشن اصلیت. HomeController رو به صورت زیر تغییر بدی مشکلت حل میشه:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult CreatePerson()
    {
        var model = TempData["ChangedModel"] as Person ?? new Person();
        return View(model);
    }

    [HttpPost]
    public ActionResult CreatePerson(Person person)
    {
        person.PersonId += 1;
        person.FirstName += "- approved";
        person.LastName += "- approved";
        TempData["ChangedModel"] = person;
        return RedirectToAction("CreatePerson");
    }
}
پاسخ در 1395/05/04 توسط

پاسخ شما