مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

شهرام برزنی

عضویت از 1395/09/14

customize نمودن کنترلر و View

  • چهارشنبه 11 مرداد 1396
  • 13:00
تشکر میکنم
سلام استاد عزیز احوال شما؟
میخواهم کنترلر  و View قسمت create را Customize کنم. اما به محض اینکه فیلدهای اضافی را حذف میکنم، افزودن کار نمیکند و هیچ رکوردی اضافه نمیشود. حدسم اینه که Modelstae شرط isvalid را درست برنمیگرداند. چون if modelstate.isvalid را کامنت کردم رکورد را insert  میکنه. درمورد Edit مشگلی نیست.
ممنون از مساعدت شما
@model DataLayer.Users
@{
    ViewBag.Title = "افزودن " + Server.HtmlDecode(Html.DisplayNameFor(model => model).ToString());
}
<h2>افزودن @Html.DisplayNameFor(model => model)</h2>
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    
    <div class="form-horizontal">        
        @Html.ValidationSummary(true)
        <div class="form-group">
            @Html.LabelFor(model => model.RoleId, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("RoleId", String.Empty)
                @Html.ValidationMessageFor(model => model.RoleId)
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.UserName, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UserName)
                @Html.ValidationMessageFor(model => model.UserName)
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.PassWord, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PassWord)
                @Html.ValidationMessageFor(model => model.PassWord)
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.Email, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Email)
                @Html.ValidationMessageFor(model => model.Email)
            </div>
        </div>
        <div class="form-group">
<div class="col-md-2">
            </div>
            <div class="col-md-10">
                @Html.EditorFor(model => model.IsActive)
@Html.LabelFor(model => model.IsActive)
                @Html.ValidationMessageFor(model => model.IsActive)
            </div>
        </div>
        <div class="form-group" id="buttons">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="ایجاد" class="btn btn-primary" />
@Html.ActionLink("بازگشت به فهرست", "Index")
            </div>
        </div>
    </div>
}
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

پاسخ های این پرسش

تعداد پاسخ ها : 9 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 11 مرداد 1396
  • 13:03

لطفا کد های خود در فرمت code کد قرار دهید،

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 11 مرداد 1396
  • 13:03

لطفا کد ها را با استفاده از کلید code ادیتور قرار دهید تا بشه خوند

کدهای مدل user را نیز قرار  دهید

کاربر سایت

شهرام برزنی

عضویت از 1395/09/14

  • چهارشنبه 11 مرداد 1396
  • 13:08
@model DataLayer.Users

@{
    ViewBag.Title = "افزودن " + Server.HtmlDecode(Html.DisplayNameFor(model => model).ToString());
}

<h2>افزودن @Html.DisplayNameFor(model => model)</h2>


@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    
    <div class="form-horizontal">        
        @Html.ValidationSummary(true)

        <div class="form-group">
            @Html.LabelFor(model => model.RoleId, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("RoleId", String.Empty)
                @Html.ValidationMessageFor(model => model.RoleId)
            </div>
        </div>


        <div class="form-group">
            @Html.LabelFor(model => model.UserName, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UserName)
                @Html.ValidationMessageFor(model => model.UserName)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.PassWord, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PassWord)
                @Html.ValidationMessageFor(model => model.PassWord)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Email, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Email)
                @Html.ValidationMessageFor(model => model.Email)
            </div>
        </div>

        <div class="form-group">
			<div class="col-md-2">
            </div>
            <div class="col-md-10">
                @Html.EditorFor(model => model.IsActive)
				@Html.LabelFor(model => model.IsActive)
                @Html.ValidationMessageFor(model => model.IsActive)
            </div>
        </div>



        <div class="form-group" id="buttons">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="ایجاد" class="btn btn-primary" />
				@Html.ActionLink("بازگشت به فهرست", "Index")
            </div>
        </div>
    </div>
}


<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
--------------------------------------------------------------------------------------------------------------
------------user class-------------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace DataLayer
{
    using System.ComponentModel.DataAnnotations;
    using System;
    using System.Collections.Generic;
    
    [MetadataType(typeof(UsersMetaData))]
    public partial class Users
    {
        public int UserId { get; set; }
        public int RoleId { get; set; }
        public string ActiveCode { get; set; }
        public string UserName { get; set; }
        public string PassWord { get; set; }
        public string Email { get; set; }
        public bool IsActive { get; set; }
        public System.DateTime RegisterDate { get; set; }
    
        public virtual Roles Roles { get; set; }

        //private class UsersMetaDate
        //{
        //}
    }
}

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 11 مرداد 1396
  • 13:19

منظورم مدلی که صفت هارو داره بود

MetaData رو قرار بدید

کاربر سایت

شهرام برزنی

عضویت از 1395/09/14

  • چهارشنبه 11 مرداد 1396
  • 13:21
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc.Html;

namespace DataLayer
{
    [DisplayName("کاربر")]
    [DisplayPluralName("کاربران")]
    public class UsersMetaData
    {
        [Key]
        public int UserId { get; set; }
        [Display(Name = "نقش کاربر")]
        [Required(ErrorMessage = "لطفا {0} را وارد کنید")]
        public int RoleId { get; set; }
        [Display(Name = "کد فعال سازی")]
        [Required(ErrorMessage = "لطفا {0} را وارد کنید")]

        public string ActiveCode { get; set; }
        [Display(Name = "نام کاربری")]
        [Required(ErrorMessage = "لطفا {0} را وارد کنید")]

        public string UserName { get; set; }
        [Display(Name = "کلمه عبور")]
        [Required(ErrorMessage = "لطفا {0} را وارد کنید")]

        public string PassWord { get; set; }
        [Display(Name = "ایمیل")]
        [Required(ErrorMessage = "لطفا {0} را وارد کنید")]

        public string Email { get; set; }
        [Display(Name = "فعال / غیر فعال")]
        [Required(ErrorMessage = "لطفا {0} را وارد کنید")]

        public bool IsActive { get; set; }
        [Display(Name = "تاریخ ثبت نام")]
        [DisplayFormat(DataFormatString = "{0: yyyy/MM/dd}")]
        [Required(ErrorMessage = "لطفا {0} را وارد کنید")]

        public System.DateTime RegisterDate { get; set; }

    }



    //[MetadataType(typeof(UsersMetaData))]
    //public partial class Users
    //{

    //}
}

کاربر سایت

شهرام برزنی

عضویت از 1395/09/14

  • چهارشنبه 11 مرداد 1396
  • 13:22

البته فایل tt را هم تغییر دادم

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 11 مرداد 1396
  • 13:24

شما به ActiveCode صفت Required دادید ولی در ویو نیست

به همین خاطر هست که ModelState نمیتونه  Valid بشه

نباید به فیلد هایی که در ویو نمیخواهید باشند صفت اجباری بدید

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 11 مرداد 1396
  • 13:26

به این دلیل IsValid شما false است که در ورودی چند پارامتر null رد می شود، شما میتوان فیلد های مورد نظر خود را داخل یک UserViewModel قرار دهید و سپس آن را با کلاس اصلی User ادقام کنید:

 public ActionResult Create(UserViewModel userViewModel)
        {
            if (ModelState.IsValid)
            {
                var user = new User()
                {
                    RoleId = userViewModel.RoleId,
                    Email = userViewModel.Email,
                    PassWord = userViewModel.PassWord,
                    IsActive = userViewModel.IsActive,
                    UserName = userViewModel.UserName
                };
            }
            // more code

            return View();
        }
    public class UserViewModel
    {
        public int RoleId { get; set; }
        public string UserName { get; set; }

        public string PassWord { get; set; }
        public string Email { get; set; }
        public bool IsActive { get; set; }
    }

کاربر سایت

شهرام برزنی

عضویت از 1395/09/14

  • چهارشنبه 11 مرداد 1396
  • 13:29

cheekycheekycrying

کاملا درست فرمودید. مشکل حل شد

بسیار سپاسگذار

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)