ASP.NET MVC - تمرير نموذج الرجوع إلى مجموعة مختلفة من وحدة تحكم في العرض باستخدام C#

StackOverflow https://stackoverflow.com/questions/1415931

  •  06-07-2019
  •  | 
  •  

سؤال

بالنظر إلى جمعيتين:

المشروع.ويب
المشروع.ليب

المشروع.ويب الجمعية مراجع المشروع.ليب الذي يحتوي على بعض الأعمال المنطق.فئة بسيطة من المشروع.lib:

public class Person
{
    public string Name;
}

في المشروع.ويب.التحكم:

Using project.lib.models;

public class PersonController : Controller
{
    Person person = new Person();

    public ActionResult Index()
    {
        return View(person);
    }
}

هذا هو الجزء حيث لدي بعض الأسئلة.في الكثير من مشاريع عينة رأيت التالية في نظر (في هذه الحالة مؤشر.aspx):

<% @Import Namespace="project.lib.models" %>

مما يتيح لك استخدام نموذج كائن مثل هذا:

<%= Model.Name %>

أنا لم أذهب إلى العمل مثل الأمثلة, لقد اضطررت إلى القيام به:

<%= (Model as Person).Name %>

أو

<%
    var person = (Person)Model;
    Response.Write(person.Name);
%>

لماذا هذا هكذا ؟ ما هو السبب لهذا ؟ التعليقات ؟ اقتراحات ؟ صفي التعريف يبدو مثل هذا:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace project.lib.models
{
    public class Person
    {
        public Int64 PersonID;
        public string DisplayName;
        public string RealName;
    }
}
هل كانت مفيدة؟

المحلول

وجهة نظرك قد لا تكون بقوة كتبته.جرب ما يلي:

  1. نسخ عرض العلامات
  2. حذف عرض
  3. انتقل إلى وحدة تحكم العمل الذي يقود عرض
  4. انقر على الحق في هذا الأسلوب ، حدد إضافة خيار عرض.
  5. تأكد من أن هذا هو بقوة كتبته العرض بشكل صحيح تحديد نوع المقصود نموذج.
  6. لصق عرض العلامات في حديثا الرأي.

هذا يجب أن تعمل.أنها لا تبدو وكأنها كنت في عداد المفقودين الجمعية لأنك قادرة على الإدلاء النموذج بشكل صحيح.

وتجدر الإشارة إلى أنه يمكنك أن تفعل ما سبق من دون ألم حذف/إعادة نظر.وقد عرض كل إعلان أول خط مشابهة للرسالة التالية:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<DomainModel.Person>" %>

الفرع المهم أن نفهم بأن يرث السمة ، مما يعني أن هذا الرأي يمتد MVC ViewPage<DomainModel.Person> فئة.نموذج الملكية سوف تكون من نوع DomainModel.شخص في وقت التشغيل.

أيضا ، هناك قضايا مع الإصدارات السابقة من ASP.NET MVC أن تمنع بشكل فعال كتابة بشدة آراء من العمل بشكل صحيح.انظر المشكلة باستخدام إضافة عرض الحوار في ASP.NET MVC RC1 عن كتابتها بقوة الرأي للحصول على مزيد من التفاصيل.

تحرير:بعد قليل من عمل المحقق من قبل الجميع الذي نشر هنا ، يبدو Visual Studio كان الرجوع إلى الإصدارات القديمة من الجمعية تتضمن فئة الشخص.إغلاق بيئة التطوير أسفل ، التخلص من كل الكائنات/بن المجلدات وإعادة تشغيل ويبدو أن هذه المسألة الثابتة.

نصائح أخرى

وأرجو الرد على الخاص <٪ @ صفحة٪> التوجيه؟ وينبغي أن يكون شيئا مثل:

<%@ Page Language="C#"
         [...]
         Inherits="System.Web.Mvc.ViewPage<project.lib.models.Person>" %>

هل حاولت خلق رمز وراء كتابة بشدة ملف لهذا الرأي بدلا من ذلك؟

وأنت كنت بحاجة إلى تحديث الخاصية يرث من وجهة النظر أن يكون ملف التعليمات البرمجية الخلفية:

<%@ Page Language="C#" 
    CodeBehind="Index.aspx.cs" Inherits="project.web.Views.People.Index" %>

وثم في التعليمات البرمجية الخلفية:

namespace project.web.Views.People.Index {
  public partial class Index : System.Web.Mvc.ViewPage<project.lib.models.Person>
  {}
}

وأنا لا أعتقد أنها مشكلة مع حل الطبقة System.Web.Mvc.ViewPage في ذلك الحين أن الصفحة لا يتم تحميل (كنت أحصل استثناء على طول الخطوط التي System.Web.Mvc.ViewPage لا يمكن أن يكون وجدت)، وأنك لن تكون قادرة على الوصول إلى الخاصية النموذجية.

تحديث 1: لاحظ أنه يمكنك أن تكون متأكد جدا أنه ليس مشكلة التحميل/الحصول على أنواع النظام.ويب.Mvc.ViewPage أو المشروع.lib.نماذج.الشخص.كما ذكرت في سؤالك فإنه لا يعمل عند استخدام:

<% @Import Namespace="project.lib.models" %>
...
<%= (Model as Person).Name %>

باستخدام System.Web.Mvc.ViewPage<project.lib.models.Person> على صفحة التوجيه ، <%= Model.Name %> يجب أن تعمل.بعض الأشياء الإضافية سأحاول إذا كان هذا لا يعمل:

  • إزالة استيراد التوجيه عند القيام بذلك.
  • تحقق مما إذا كان لديك مساحة إضافة على شبكة الإنترنت.config.

في حين أن أيا من أولئك 2 أعلاه ينبغي أن يسبب أي مشاكل إذا كنت لا تحصل على العمل مع ما ذكر من قبل أنه سيكون غريب جدا السيناريو.لاحظ أيضا أنه إذا قمت بإضافة استخداما مساحات في شبكة الإنترنت.config يمكنك استخدام ViewPage<Person> على صفحة التوجيه.


على نموذج.اسم يمكنك الرجوع إلى لا يجب أن نفعل مع استيراد مساحة الاسم ، يمكنك الحصول عليه من النوع الذي يقع في توجيه الصفحة.

على ViewPage فئة لديها ممتلكات T نموذج, وهذا هو السبب يمكنك الوصول إلى الخاصية اسم (كنت تعمل مع النوع المحدد).

وللقيام بذلك وجهة نظركم يجب كتابة بقوة إلى كائن النموذج الخاص بك في قضيتك فئة الشخص

وكل ما تحتاجه لجعله العمل يضيف المنشأ إلى project.lib ويضيف تحديث derictive الصفحة:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top