将一个 class 中的 属性 访问另一个

Access property of one class to another

我正在尝试在提交表单时将数据保存在列表中。但是在我的模型中,一个 属性 Phonenumber 来自其他模型 class 并且由于该错误即将到来。请检查下面的整个代码。

这是我的看法

@using (Html.BeginForm("Index", "Person"))
{
    <div>
        User : <input type="text" name="Name"/>
    </div>
    <div>
        Contact : <input type="text" name="Contact.PhoneNumber"/>
    </div>
    <div>
        <input type="submit" value="save"/>
    </div>
}

这是模特 class :

namespace WebApplication1.Models
{
    public class Person
    {
        public string Name { get; set; }
        public Contact Contact { get; set; }
    }
}

这是提交表单时的控制器post方法:

[HttpPost]
        public IActionResult Index(Person person)
        {
public static List<Person> Persons = new List<Person>();

            var name = person.Name;
            string phone = person.Contact.PhoneNumber;

            Persons.Add(new Person
            {
                Name = name,
                Contact = phone // here error is coming like cannot implicitly convert type 'string' to 'WebApp1.Models.Contact'
            });

            return View("List");
        }

我想在提交表单时将此数据添加到人员列表中..但是我在这一行中遇到错误。

Contact = phone // 无法将类型 'string' 隐式转换为 'WebApp1.Models.Contact'

这里有任何想法。

谢谢

Contact = phone

您正在尝试分配不合适的内容。错误已经解释过了,但让我们看看您是如何解决这个问题的:

public class Person
{
    public string Name { get; set; }
    public Contact Contact { get; set; }
}

ContactContact 类型,我认为它是您代码库中的 class。

string phone = person.Contact.PhoneNumber;

phone 是一个字符串,正如您在此处明确确认的那样。

现在,错误消息应该有意义了:

cannot implicitly convert type 'string' to 'WebApp1.Models.Contact'

换句话说:

"You can't put a string in a property of type Contact". Doesn't make sense. I refuse to compile this.

注:之所以说隐式转换是因为有办法让一种类型可以赋值给另一种类型的variable/property。当您将一种类型分配给另一种类型的 variable/property 时,编译器将尝试查看是否可以进行隐式转换,但在您的情况下是不可能的。此外,在这种情况下,隐式转换不是您需要的解决方案。


怀疑你试图这样做:

Persons.Add(new Person
{
    Name = name,
    Contact = new Contact()
    {
        PhoneNumber = phone
    }
});

鉴于代码,您已经有一个 person,所以我不确定您为什么要尝试重新创建一个具有相同值的新 Person 实例。你本来可以做到的:

Persons.Add(person);

然后完全跳过 var namestring phone 声明。