Tại sao tôi nhận được null thay vì chuỗi trống khi nhận được yêu cầu POST từ Razor View?


76

Tôi đã từng nhận được chuỗi trống khi không có giá trị:

[HttpPost]
public ActionResult Add(string text)
{
    // text is "" when there's no value provided by user
}

Nhưng bây giờ tôi đang vượt qua một mô hình

[HttpPost]
public ActionResult Add(SomeModel Model)
{
    // model.Text is null when there's no value provided by user
}

Vì vậy tôi phải sử dụng ?? ""toán tử.

Tại sao chuyện này đang xảy ra?


Một giải pháp thay thế để sử dụng các thuộc tính trên từng thuộc tính mô hình, như được mô tả bên dưới, là sử dụng chất kết dính mô hình tùy chỉnh, xem stackoverflow.com/questions/12734083/…
Anders

Câu trả lời:


162

Bạn có thể sử dụng DisplayFormatthuộc tính trên thuộc tính của lớp mô hình của mình:

[DisplayFormat(ConvertEmptyStringToNull = false)]

Điều này đã giúp tôi ràng buộc mô hình ngầm định trước khi hành động của tôi được thực thi. Đã sử dụng nó cùng với MetadataTypeAttribute để đánh dấu thuộc tính được tạo tự động của Entity Framework Model-First class
EvAlex

1
Đây chắc chắn là một điều nên biết.
Serge

Tôi đang sử dụng: public ActionResult Quotations(string projectName, string brandName, string modelName, string clientName) { var model = _dataAccess.Quotations_Select(projectName, brandName, modelName, clientName); return View(model); } gọi một thủ tục được lưu trữ và cung cấp các giá trị, do đó, thuộc tính sẽ không hoạt động đối với tôi. Tôi nên làm gì?
Talal Yousif

3
Đó là một chặng đường dài, ngoài ra, trong MVC6, nếu bạn (như tôi) vì lý do nào đó không muốn đặt điều này thông qua một thuộc tính và muốn lưu trữ siêu dữ liệu của mình ở nơi khác, bạn có thể viết nhà cung cấp siêu dữ liệu của riêng mình và đăng ký nó trong Startup cs thích: AddMvc(o => ModelMetadataDetailsProviders.Add(new YourProvider())). Ở đó, GetDisplayMetadatabạn có thể làm mọi việc mà các thuộc tính làm. Đối với câu hỏi này nó sẽ đượccontext.DisplayMetadata.ConvertEmptyStringToNull = false;
evilkos

Điều này mâu thuẫn với xác thực khác của tôi mà tôi có trên tài sản. Tôi đã kết thúc việc tạo một thuộc tính với trường sao lưu nơi get trả về chuỗi trống nếu trường sao lưu là rỗng.
Peheje

9

Liên kết mô hình mặc định sẽ tạo một SomeModel mới cho bạn. Giá trị mặc định cho kiểu chuỗi là null vì nó là kiểu tham chiếu, vì vậy nó được đặt thành null.

Đây có phải là một trường hợp sử dụng cho phương thức string.IsNullOrEmpty () không?


1
Yeah đó là những gì tôi nghĩ. Tôi không nhận ra rằng giá trị mặc định cho kiểu chuỗi là null, không phải String.Empty. Không, nó không phải là trường hợp của phương thức IsNullOrEmpty, tôi không có cột NULL trong bảng SQL của mình, vì vậy tôi nhận được một ngoại lệ khi có chuỗi rỗng. Vì vậy, tôi đoán tôi sẽ phải tiếp tục sử dụng ?? "" nhà điều hành. Cảm ơn!
Alex,

Bạn cũng có thể sử dụng một tài sản với một cửa hàng quay lại và trở lại string.Empty thay vì null từ ViewModel, ví dụ như:
hackerhasid

1
gâu gâu! đây là một số mã psuedocode: private string _text; public string Text {get {return _text; } đặt {_text = value ?? string.empty; }} - tương tự như vậy
hackerhasid

2

Tôi đang thử điều này trong Tạo và Chỉnh sửa (đối tượng của tôi được gọi là 'thực thể'): -

        if (ModelState.IsValid)
        {
            RemoveStringNull(entity);
            db.Entity.Add(entity);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(entity);
    }

Cái này gọi là: -

    private void RemoveStringNull(object entity)
    {
        Type type = entity.GetType();
        FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public | BindingFlags.NonPublic);
        for (int j = 0; j < fieldInfos.Length; j++)
        {
            FieldInfo propertyInfo = fieldInfos[j];
            if (propertyInfo.FieldType.Name == "String" )
            {
                object obj = propertyInfo.GetValue(entity);
                if(obj==null)
                    propertyInfo.SetValue(entity, "");
            }
        }
    }

Nó sẽ hữu ích nếu bạn sử dụng Database First và các thuộc tính Model của bạn bị xóa sạch mỗi lần hoặc các giải pháp khác không thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.