PDA

View Full Version : استفاده از دو ویو مدل جداگانه در یک ویو .



elham9
شنبه 26 خرداد 1397, 21:27 عصر
سلام

من میخام در یک ویو دو تا ویومدل رو استفاده کنم ؟ ممنون میشم راهنمایی بفرمایید . الان دوتا ویو دارم یکی ویوی لاگین و ویوی بعدی رجیستر هست . و اکنون میخام هر دو در یک صفحه باشن منتها اینپوتهای مربوط به هر اکشن در پنل جدایی قرار داشته باشه .
سپاس

elham9
یک شنبه 27 خرداد 1397, 10:43 صبح
من یک ویو مدل کلی ساختم بصورت زیر :

public class ViewModel {

public LoginViewModel LoginModel { get; set; }
public RegisterViewModel RegisterModel { get; set; }

}


بعد در ویوی لاگین کدها بصورت زیر هست :


@model ViewModel

<div>
<form asp-action="Login" asp-controller="Account" asp-route-returnUrl="@ViewData["ReturnUrl"]" onsubmit="return validateForm()">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<input asp-for="LoginModel.Email" id="InputEmail" class="form-control" />
</div>
<div class="form-group">
<input asp-for="LoginModel.Password" id="InputPassword" class="form-control" />
</div>
<div class="form-group">
<div class="checkbox">
<label>
<input asp-for="LoginModel.RememberMe" />
</label>
</div>
</div>
<div class="form-group">
<input type="submit" value="ورود" class="btn btn-primary" />
</div>
</form>

<form asp-action="Register" asp-controller="Account" asp-route-returnUrl="@ViewData["ReturnUrl"]" onsubmit="return validateForm()">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">

<input asp-for="RegisterModel.Email" id="InputEmail" class="form-control" />

</div>
<div class="form-group">

<input asp-for="RegisterModel.Password" id="InputPassword" class="form-control" />

</div>
<div class="form-group">

<input asp-for="RegisterModel.ConfirmPassword" id="InputConfirmPassword" class="form-control" />

</div>
<div class="form-group">
<input type="submit" value="ثبت نام" class="btn btn-success" />
</div>
</form>

</div>


ولی داده ای رو که به سمت اکشن ها میفرسته نال هست . ممنون میشم بید کجا رو اشتباه رفتم ؟

ali_md110
یک شنبه 27 خرداد 1397, 11:19 صبح
در کنترولر باید این دو ویومدل وهله سازی شوند



public ActionResult Login()
{

var model = new ViewModel
{
LoginModel=new LoginViewModel();

RegisterModel=new RegisterViewModel();
};
return View(model);
}
البته میتونید بجای وهله سازی در کنترولر در سازنده کلاس ویومدل هم اینکار رو بکنید


public class ViewModel {
public ViewModel()
{

LoginModel=new LoginViewModel();

RegisterModel=new RegisterViewModel();
}

public LoginViewModel LoginModel { get; set; }
public RegisterViewModel RegisterModel { get; set; }


}

elham9
یک شنبه 27 خرداد 1397, 11:32 صبح
بسیار بسیار تشکر:تشویق:

hakim22
یک شنبه 27 خرداد 1397, 11:38 صبح
در ASP.NET Core بهترین راه اینه که از ViewComponent استفاده کنید. در VC می تونه یک مدل و ویوی خودش رو داشته باشه و در نهایت در هر صفحه ای بخواهید قرار میگیره.

دوم اینکه به نام گداری مدل و قسمتهای مربوط به asp-for دقت کنید که باید دقیقا همخوانی داشته باشن.

دقت کنید که تعریف مدل در بالای صفحه فقط جهت کمک به کد نویسی هست وگرنه در HTTP چنین چیزی نداریم. اطلاعات فرم توسط اتریبیوت name هر input به سرور ارسال میشه.
از اونجایی که فرمهای ورود و ثبت نام کوچک است شما بجای تعریف کردن مدل و ... می توانید قسمت مربوط به asp-for رو حذف کنید (یعنی از ASP کمک نگیرید) و خودتون مقدار name رو مشخص کنید.

بعدا در سرور سیستم Model Binding اطلاعات دریافتی از فرم رو درون شی LoginView یا RegisterView قرار میده.

elham9
یک شنبه 27 خرداد 1397, 14:47 عصر
در ASP.NET Core بهترین راه اینه که از ViewComponent استفاده کنید. در VC می تونه یک مدل و ویوی خودش رو داشته باشه و در نهایت در هر صفحه ای بخواهید قرار میگیره.


بسیار ممنون . یعنی اینکه مثه پارشال ویوها یک ویوکامپوننت register درست کنم و یک ویوکامپوننت login . سپس در صفحه مربوط به authentication قرارشون بدم ؟ دیگه لازم نیس یه ویومدل کلی برای دوتاشون تشکیل بدم ؟ویوکامپوننتها جایگزین پارشال ویو ها هستند ؟

hakim22
یک شنبه 27 خرداد 1397, 16:40 عصر
پارشیال ویو فقط ویو هست. هر چند میتونه مدل داشته باشه اما اطلاعات این ویو از اکشن در کنترلر نمیاد. بلکه از درون ویوی مادر میاد.
ویو کامپوننت نیاز به یک اکشن در سمت سرور داره و اطلاعاتش رو از اون میگیره. جایگزین Html.Action در MVC 5 شده.

از هر دوی این ها می توانید برای هدف استفاده کنید. ظاهرا پارشیال ویو برای هدف شما در این بخش کفایت می کنه.