Umbraco会员-如何在注册表格中保存自定义属性?

时间:2019-06-04 14:51:27

标签: c# umbraco registration umbraco7

我想在Umbraco网站上注册新成员,并允许他们访问保留区。
我需要从他们那里收集一些其他信息,例如他们的名字,姓氏,公司名称,电话号码等。


因此,对于 后端 ,在我的Umbraco网站的“成员”部分中,我这样做:

  • 创建了一个新的MemberType,称为“ memberWebsite”
  • 在我的“ memberWebsite” MemberType中添加了一个新标签“其他信息”
  • 在新标签中,我添加了新的自定义属性:名字,姓氏,公司名称等
  • 所有这些属性都具有“文本字符串”编辑器
  • 所有这些属性均已选中“成员可以编辑”复选框和“在成员个人资料上显示”复选框

对于 前端 ,我使用Umbraco提供的“注册会员”代码段为新会员的注册表格创建了新的部分视图。 。


我只更改了registerModel的成员类型,指定了新的MemberType“ memberWebsite”,如摘要注释中所建议的那样。

@*
        You can specify a custom member type alias in the constructor, the default is 'Member'    
        for example, to use 'Custom Member' you'd use this syntax:

        var registerModel = Members.CreateRegistrationModel("Custom Member");
    *@

//var registerModel = Members.CreateRegistrationModel();
var registerModel = Members.CreateRegistrationModel("memberWebsite");

新成员自定义属性的字段正确显示在注册页面中。
我用一些值填充它们,然后单击“提交”按钮。
我希望在创建的新成员上找到这些值,但只保存标准字段(例如,名称,电子邮件,密码)。
自定义属性完全空白,就像我从未填写过一样。

如何使用输入的值正确保存自定义属性?
PS:我正在运行Umbraco 7.14.0。

2 个答案:

答案 0 :(得分:0)

您需要指定要填充的成员属性。 请尝试以下操作:

import React, { Component } from "react"
import { compose } from "recompose"
import {
  withScriptjs,
  withGoogleMap,
  GoogleMap,
  Marker,
  InfoWindow, Listing
} from "react-google-maps"
const MapWithAMarker = compose(withScriptjs, withGoogleMap)(props => {
  const listStyle = {
    width: '250px',
    position: "relative"
  }
  return (
    <div style={{ position: "relative" }}>
      <GoogleMap defaultZoom={4} defaultCenter={{ lat: 56.263920, lng: 9.501785 }}>
        {props.markers.map(marker => {
          if (marker.lat != null) {

            const onClick = props.onClick.bind(this, marker)
            return (
              <Marker
                key={marker.customerNumber}
                onClick={onClick}
                position={{ lat: parseFloat(marker.lat), lng: parseFloat(marker.lng) }}
              >
                {props.selectedMarker === marker &&
                  <InfoWindow>
                    <div>
                      <h1> {marker.name}</h1>
                      <br />
                      {marker.address}
                      <br />
                      {marker.zipcode} {marker.city}
                      <br />
                      Telephone: {marker.phone}
                    </div>
                  </InfoWindow>}

{/* List resellers here, so info window can be reused I guess, not sure */}
              </Marker>

            )
          }         
        })}
      </GoogleMap>

    </div>
  )
})
export default class ResellerGoogleMap extends Component {
  constructor(props) {
    super(props);
    this.state = {
      showingInfoWindow: false,
      selectedMarker: {},
      selectedPlace: {}
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick(marker, event) {
    console.log(this.props)
    this.setState({
      selectedMarker: marker
    });
  }

  render() {

    return (
      <div style={{ padding: "24px 13px 2px 2px" }}>
        <input type="button" value="My Location" style={{ marginBottom: "20px" }} onClick={(e) => this.onBtnClick()} />

        <MapWithAMarker
          selectedMarker={this.state.selectedMarker}
          markers={this.props.resellerData}
          onClick={this.handleClick}
          googleMapURL="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places"
          loadingElement={<div style={{ height: `100%`, padding: `61px 55px 55px 55px` }} />}
          containerElement={<div style={{ height: `800px` }} />}
          mapElement={<div style={{ height: `511px` }} />}
        />
      </div>
    );
  }
}


答案 1 :(得分:0)

好的,我找到了解决该问题的方法。

“注册会员”代码段中的代码[不工作]

@if (registerModel.MemberProperties != null)
        {
            for (var i = 0; i < registerModel.MemberProperties.Count; i++)
            {
                @Html.LabelFor(m => registerModel.MemberProperties[i].Value, registerModel.MemberProperties[i].Name)

                @Html.EditorFor(m => registerModel.MemberProperties[i].Value)
                @Html.HiddenFor(m => registerModel.MemberProperties[i].Alias)
                <br />
            }


        }

我没有遍历带有索引i的MemberProperties数组,而是能够通过逐个检索属性来访问属性。我使用了实际的索引号而不是变量i。

新代码[工作中]

@if (registerModel.MemberProperties != null)
        {
            // first property
            @Html.LabelFor(m => registerModel.MemberProperties[0].Value, registerModel.MemberProperties[0].Name)

            @Html.EditorFor(m => registerModel.MemberProperties[0].Value)
            @Html.HiddenFor(m => registerModel.MemberProperties[0].Alias)
            <br />

            // second property
            @Html.LabelFor(m => registerModel.MemberProperties[1].Value, registerModel.MemberProperties[1].Name)

            @Html.EditorFor(m => registerModel.MemberProperties[1].Value)
            @Html.HiddenFor(m => registerModel.MemberProperties[1].Alias)
            <br />

            // ... and so on for all the other MemberProperties defined in my MemberType
            }
        }

由于某种原因,for循环在所有属性属性中添加了前缀“ CS $ <> 8__locals1”。 注册表单传递的属性的别名与MemberType中定义的属性的别名不匹配。

使用此修复程序,别名匹配和属性值正确保存在创建的新成员上。